我有一个简单的内核来初始化一个数组:
__global__ void test(int *result) {
unsigned int gID = blockIdx.x * blockDim.x + threadIdx.x;
unsigned int sID = blockIdx.y * blockDim.y + threadIdx.y;
result[sID] = sID + gID;
}
我想启动这个内核,好像它是一个双循环方式。我的设置如下:
int size = 30;
int * result = (int*) malloc(sizeof(int)*size);
int *resultD;
cudaMalloc((void**)&resultD, sizeof(int)*size);
for(int i = 0; i < size; i++) {
result[i] = 0;
}
cudaMemcpy(resultD, result, sizeof(int)*size, cudaMemcpyHostToDevice);
dim3 block(100,30);
test<<<1, block>>>(resultD);
cudaMemcpy(result, resultD, sizeof(int)*size, cudaMemcpyDeviceToHost);
for(int i = 0; i < size; i++) {
cout << result[i] << endl;
}
我的结果只有0(零)。你能帮帮我吗?对不起,我是新来的。非常感谢。
答案 0 :(得分:2)
您的结果未更改的原因是内核无法启动。
请务必始终检查来自主机的CUDA api调用的返回错误代码,以捕获这些类型的错误。
在这种情况下,您会发现指定启动失败的错误,原因是您的块大小(30 * 100 = 3000)大于允许的最大大小(1024)。如果您想要内核那么多线程(这不是不合理的),你需要将它们分成多个线程块。