我的带调整的 cuda 内核复制矩阵不起作用

My cuda kernal copying matrix with adjustment is not working

我正在尝试利用 cuda 来加速我的代码,它一直在工作,直到这个内核。内核应该做的是复制一个 mxn 矩阵 d_A 到另一个内存 space,忽略第 p 行。产生 (m-1)xn 矩阵。

__global__ void copyWOp(int m, int n, int p, double* d_tobeCopied, double* d_Copied) //copy tobeCopied to copied without pth row
{
    int thread2Dpx=blockIdx.x * blockDim.x + threadIdx.x;
    int thread2Dpy=blockIdx.y * blockDim.y + threadIdx.y;
    if (thread2Dpx>=m || thread2Dpy>=n)
        return;
    int thread1Dp=thread2Dpy*(m)+thread2Dpx;

    if (thread2Dpx<p)
      d_Copied[thread2Dpy*(m-1)+thread2Dpx]=d_tobeCopied[thread1Dp];
    else if (thread2Dpx==p)
      return;
    else
      d_Copied[thread2Dpy*(m-1)+thread2Dpx-1]=d_tobeCopied[thread1Dp];
} 

下面是我调用内核的方式

cudaMalloc(&d_newA,(m-1)*n*sizeof(double));
const dim3 blockSize1(32,32,1);
const dim3 gridSize1 ((m + blockSize1.x - 1) / blockSize1.x, (n + blockSize1.y - 1) / blockSize1.y,1);
copyWOp<<<blockSize1,gridSize1>>>(m,n,p,d_A,d_newA);
cudaFree(d_A);

d_A=d_newA;

但是不知何故,当我在内核之后检查 d_newA 的范数时,它给出了一个零,而 d_A 不是。所以内核显然没有工作。

我写了几个类似的内核,它们都使用完全相同的索引变量工作。

我知道内核很幼稚,但我想在优化之前先让事情正常运行。

您颠倒了块和网格内核启动参数。这肯定是一个很可能会阻止您的内核启动的问题:

const dim3 blockSize1(32,32,1);
const dim3 gridSize1 ((m + blockSize1.x - 1) / blockSize1.x, (n + blockSize1.y - 1) / blockSize1.y,1);
copyWOp<<<blockSize1,gridSize1>>>(m,n,p,d_A,d_newA);
            ^ 
            |  
         grid parameter comes first, then block

任何时候您在使用 CUDA 代码时遇到问题,最好使用 proper cuda error checking。您可能会得到内核出现问题的指示,而实际错误可能表明问题出在您的某个内核启动参数上。