我想知道我可以应用哪些技术来添加数组的某些维度并保存到新的 Vet 较低的位置,如下例所示:
A -> [1,2], [3,4], [5,6]
B -> [3]、[7]、[11]
我想知道我可以应用哪些技术来添加数组的某些维度并保存到新的 Vet 较低的位置,如下例所示:
A -> [1,2], [3,4], [5,6]
B -> [3]、[7]、[11]
如果您想编写自己的 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]