Cuda 使用二维启动的内核不工作

Cuda 使用二维启动的内核不工作,cuda,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 =

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

__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;
}
int size=30;
int*result=(int*)malloc(sizeof(int)*size);
int*resultD;
cudamaloc((void**)和resultD,sizeof(int)*size;
对于(int i=0;icout结果保持不变的原因是内核无法启动

确保始终检查主机CUDA api调用返回的错误代码,以捕获这些类型的错误


在这种情况下,您会发现一个指定启动失败的错误,其原因是您的块大小(30*100=3000)大于允许的最大大小,即1024,您需要将它们划分为多个线程块。

结果保持不变的原因是内核无法启动

确保始终检查主机CUDA api调用返回的错误代码,以捕获这些类型的错误

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