0

我想知道我可以应用哪些技术来添加数组的某些维度并保存到新的 Vet 较低的位置,如下例所示:

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

B -> [3]、[7]、[11]

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

4

1 回答 1

1

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

__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按列主要顺序存储数组,则可以提高效率:

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

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

__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 示例代码创建一些东西,但我建议使用推力,特别是reduce_by_key

您将保留您的A数组并将其用作“值”:

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

您将创建一个与 A 数组的行相对应的“键”数组:

K -> [0,0], [1,1], [2,2]
于 2013-08-24T00:21:23.520 回答