首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sum如何在Cuda中分组

sum如何在Cuda中分组
EN

Stack Overflow用户
提问于 2013-08-24 07:51:23
回答 1查看 121关注 0票数 0

我想知道我可以应用什么技术来增加数组的一些维数并保存到新的Vet know,如下面的示例所示:

A -> 1,2,3,4,5,6

B -> 3、7、11

图:http://snag.gy/83Qwl.jpg

EN

回答 1

Stack Overflow用户

发布于 2013-08-24 08:21:24

如果您想编写自己的CUDA内核,请看一下Vector add sample。不是将2个输入向量传递给内核,而是只传递A并提供一个循环来对A的“行”求和

代码语言:javascript
复制
__global__ void mykernel(int *A, int *B, int rows, int cols){
  int idx=threadIdx.x+blockDim.x*blockIdx.x;
  if (idx < rows) {
    int sum = 0;
    for (int i=0; i< cols; i++)
      sum += A[(idx*cols)+i];
    B[idx] = sum;
    }
}

这将不是非常有效,但是如果您可以按列主序存储A数组,则可以提高效率:

代码语言:javascript
复制
A -> [1,3,5], [2,4,6] 

然后,对上述内核的修改将变得非常有效:

代码语言:javascript
复制
__global__ void mykernel(int *A, int *B, int rows, int cols){
  int idx=threadIdx.x+blockDim.x*blockIdx.x;
  if (idx < rows) {
    int sum = 0;
    for (int i=0; i< cols; i++)
      sum += A[(i*cols)+idx];
    B[idx] = sum;
    }
}

如果您正在寻找效率,但不能重新组织您的数据,那么分段并行缩减将是最快的。您可以尝试基于cuda sample codes创建一些内容,但我建议您使用thrust,特别是reduce_by_key

您将保留A数组不变,并将其用作“值”:

代码语言:javascript
复制
A -> [1,2], [3,4], [5,6] 

您将创建一个"key“数组,该数组对应于A数组的行:

代码语言:javascript
复制
K -> [0,0], [1,1], [2,2]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18413481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档