问题是这样的,比如我有3个数组{1,2,3},{1,2,3,4,5},{10,11}它们的长度不一定相同,现在想把它们通过CUDA进行求和,最终得到结果6,15,21,分别对应1+2+3、1+2+3+4+5、10+11.现在不知道应该怎么组织cudaMalloc和cudaMemcpy来批量完成这一功能。
暂时设想的是每个threadIdx.x线程传进1个数组和一个长度,求和之后写到一个对应threadIdx.x下的result数组里。但现在不知道怎么传进去
设想的代码如下,当然还是没法运行的:
__global__ void addArray(int ** dev_a, int *dev_arraySize) { int i = threadIdx.x; int sum = 0; for (int k = 0; k < dev_arraySize[i]; k++) { sum += dev_a[i][k]; } printf("第%d个数组的求和结果:%d\n", i, sum); } int main() { int a0[3] = { 1, 2, 3 }; int a1[5] = { 1, 2, 3, 4, 5 }; int a2[2] = { 10, 11 }; int arraySize[3] = { 3, 5, 2 }; int **a = new int*[3]; a[0] = a0; a[1] = a1; a[2] = a2;
int **device_a;
int *dev_arrSize;
cudaMalloc((void**)&device_a, sizeof(int*)*3);
cudaMalloc((void**)&dev_arrSize, sizeof(int)*3);
cudaMemcpy(device_a, a, sizeof(int*)*3, cudaMemcpyHostToDevice);
cudaMemcpy(dev_arrSize, arraySize, sizeof(int)*3, cudaMemcpyHostToDevice);
addArray << <1, 3 >> >(device_a, dev_arrSize);
return 0;
}