如何正确调试cuda内核?

问题描述 投票:0回答:1

我有这个功能:

void initializeCudaMatrixWithCPUMatrix(float *hostA, float *cudaA, int n,
                                       int m) {
  // float testt = hostA[888];
  cudaMalloc((void **)&cudaA, n * m * sizeof(float));
  cudaMemcpy(cudaA, hostA, n * m * sizeof(float), 
  cudaMemcpyHostToDevice);
  cudaDeviceSynchronize();
  // testt = cudaA[888];
}

我这样称呼它:

  initializeCudaMatrixWithCPUMatrix(model->embeddingMatrix,
                                    model->embeddingMatrixCuda, 408, 1024);

然后我打电话:

broadcastMatrix(trademodel->embeddingMatrixCuda, 
                broadcastedEmbeddingMatrix, 408, 1024, 128); 

然后在一个单独的文件中我有:

extern "C" void broadcastMatrix( float *Matrix, float *BroadcastedMatrix,
                                 int rows, int cols, int batchsize )   {   
    dim3 rows2d(rows, batchsize);
    broadcastMatrixKernel<<<rows2d, cols>>>(Matrix, BroadcastedMatrix,
                                            rows, cols, batchsize); 
}

然后在该文件以及内核本身中:

__global__ void broadcastMatrixKernel(float *Matrix, float *BroadcastedMatrix, 
                                      int rows, int cols, int batchsize) {
   int rowIdx = blockIdx.x;
   int batchIdx = blockIdx.y;
   int colIdx = threadIdx.x;
   if (rowIdx < rows && colIdx < cols && batchIdx < batchsize) { 
       BroadcastedMatrix[batchIdx * rows * cols + rowIdx * cols + colIdx] = 
       Matrix[rowIdx * cols + colIdx];   
   }
}

我在这里得到:

received signal CUDA_EXCEPTION_14, Warp Illegal Address
这个电话:

broadcastMatrix(trademodel->embeddingMatrixCuda, 
                broadcastedEmbeddingMatrix, 408, 1024, 128);

我想也许这些矩阵之一是空的,这就是为什么我想检查 testt = cudaA[888];由于这不起作用,我现在添加注释以澄清它实际上并不是代码的一部分。

@paleonix 我使用 cuda-gdb (或者可能只是 gdb?我无法在 atm 上查找它)和 launch.json 和 vscode 进行调试,这样我就可以使用断点等。但是如果我单步进入内核函数本身,它不会按我的预期工作。对于同一个块/线程对来说,这种情况也不会每次都发生。它通常块(0,0,0)线程(418,0,0)或(480,0,0)或(416,0,0),但它发生在同一个(第一个)块中,只是线程不同。也许我可以向您展示 launch.json,然后我们可以修复调试。与 printf 语句相比,我更喜欢正确的 launch.json (即内核内的正确调试)。

一些附加信息:Cuda 必须正确安装,因为在发生扭曲错误之前我调用了另一个内核并且该内核可以工作。

BroadcastedMatrix
cudaMalloc
开头,并且
cudaMalloc
对于该调用返回
cudaSuccess
,所以我认为这不是问题。 (在分配
cudaMalloc
时,
cudaSuccess
也会返回
embeddingMatrixCuda

我希望这个问题有意义,最诚挚的问候:)

c cuda gdb kernel cuda-gdb
1个回答
0
投票

您正在泄漏

initializeCudaMatrixWithCPUMatrix
中的设备端分配。你看,你让
cudaMalloc()
设置
cudaA
的值 - 这是一个本地
float*
变量,而不是对外部
float*
的引用。

当你这样称呼它时:

initializeCudaMatrixWithCPUMatrix(
    model->embeddingMatrix, model->embeddingMatrixCuda, 408, 1024);

函数返回后

model->embeddingMatrixCuda
的值保持不变。

至于以后发生的一切——从正确分配开始;然后,如果您遇到困难,也许可以问另一个问题,并且请使其非常集中。

© www.soinside.com 2019 - 2024. All rights reserved.