使用threadIdx在内核中赋值

时间:2012-09-19 10:09:17

标签: cuda gpgpu nvidia

我尝试了一种方法,以便不会使用从主机到设备的数据传输。通常,我们使用循环将值分配给Host数组中的元素,并将其传输到Device。这在1D和2D阵列上对我来说很好。我尝试的新方法是将值赋给内核中的数组元素。我成功完成了1D阵列。但是,对于2D数组,结果为0。我的设备每个块可以支持(512,512)个线程。输出值精确到长度= 22但长度= 23 [22<sqrt(512)<23]显示为“0”。根据{{​​1}},我可以看到只使用[22<sqrt(512)<23]个线程。有什么问题??为什么会这样?

守则:

22x22
  

主要功能:

    const int Length=23;
  

核心功能:

    int A[Length],B[Length],C[Length],D[Length],*Ad,*Bd;
    int size=Length*sizeof(int);
    cudaMalloc((void**)&Ad,size);
    cudaMalloc((void**)&Bd,size);
    dim3 dimGrid(1,1);
    dim3 dimBlock(Length,Length);
    FuncG<<<dimGrid,dimBlock>>>(Ad,Bd);
    cudaMemcpy(C,Ad,size,cudaMemcpyDeviceToHost);
    cudaMemcpy(D,Bd,size,cudaMemcpyDeviceToHost);
    for(int i=0;i<Length;i++){
        printf("%d  %d\n",C[i],D[i]);
    }
    return 0;

1 个答案:

答案 0 :(得分:2)

您的设备每个块只能支持512个线程。前两个线程块维度的最大维度是512.一个22x22块(484个线程)是合法的块大小,但是23x23块(529个线程)不是。

由于内核永远不会运行,因此输出为0。如果检查它,您会发现内核启动失败,执行配置错误无效。检查此类启动失败的规范方法如下:

FuncG<<<dimGrid,dimBlock>>>(Ad,Bd);
if (cudaPeekAtLastError() != cudaSuccess) {
    // handle error.....
}