Cuda 使用threadIdx在内核中赋值

Cuda 使用threadIdx在内核中赋值,cuda,gpgpu,nvidia,Cuda,Gpgpu,Nvidia,我尝试了一种方法,以便不使用从主机到设备的数据传输。通常,我们使用循环将值分配给主机数组中的元素,并将其传输到设备。这对我来说在一维和二维阵列上都很好。我尝试的新方法是,给内核中的数组元素赋值。我成功实现了1D阵列。但是,对于2D数组,结果是0。我的设备可以支持每个块(512512)个线程。输出值在Length=22之前可以正常运行,但在Length=23时显示“0”。您的设备只能支持每个块512个线程。前两个线程块的最大尺寸为512。22x22块(484个线程)是合法的块大小,但23x23块(

我尝试了一种方法,以便不使用从主机到设备的数据传输。通常,我们使用循环将值分配给主机数组中的元素,并将其传输到设备。这对我来说在一维和二维阵列上都很好。我尝试的新方法是,给内核中的数组元素赋值。我成功实现了1D阵列。但是,对于2D数组,结果是
0
。我的设备可以支持每个块(512512)个线程。输出值在Length=22之前可以正常运行,但在Length=23时显示“0”。您的设备只能支持每个块512个线程。前两个线程块的最大尺寸为512。22x22块(484个线程)是合法的块大小,但23x23块(529个线程)不是

您将获得0输出,因为内核从未运行。如果您检查它,您将发现内核启动失败,并出现无效的执行配置错误。检查此类启动失败的标准方法如下:

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

我正在检查中的块大小。是(512512,64)还是(512,1,1)?每个尺寸可能最多分别为512、512、64,但所有尺寸的乘积也可能不大于512。这是否适用于blockIdx?是的,最大网格尺寸也有限制,但这些与块尺寸不同。还有一些文档,我鼓励您阅读。它包括我想没有。文档有点模糊。否则我就不会问了。关于网格维度,根据我发布的Wiki,网格维度是(65535,1)还是(6553565535)??
    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;
__global__ void FuncG(int *Ad,int *Bd){
    int tx=threadIdx.x;
    int ty=threadIdx.y;
    Ad[tx]=tx;
    Bd[ty]=ty;
}
FuncG<<<dimGrid,dimBlock>>>(Ad,Bd);
if (cudaPeekAtLastError() != cudaSuccess) {
    // handle error.....
}