用二维启动的内核不起作用

时间:2017-03-16 11:50:25

标签: cuda

我有一个简单的内核来初始化一个数组:

__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(零)。你能帮帮我吗?对不起,我是新来的。非常感谢。

1 个答案:

答案 0 :(得分:2)

您的结果未更改的原因是内核无法启动。

请务必始终检查来自主机的CUDA api调用的返回错误代码,以捕获这些类型的错误。

在这种情况下,您会发现指定启动失败的错误,原因是您的块大小(30 * 100 = 3000)大于允许的最大大小(1024)。如果您想要内核那么多线程(这不是不合理的),你需要将它们分成多个线程块。