我有这个功能:
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
)
我希望这个问题有意义,最诚挚的问候:)
您正在泄漏
initializeCudaMatrixWithCPUMatrix
中的设备端分配。你看,你让 cudaMalloc()
设置 cudaA
的值 - 这是一个本地 float*
变量,而不是对外部 float*
的引用。
当你这样称呼它时:
initializeCudaMatrixWithCPUMatrix(
model->embeddingMatrix, model->embeddingMatrixCuda, 408, 1024);
函数返回后
model->embeddingMatrixCuda
的值保持不变。
至于以后发生的一切——从正确分配开始;然后,如果您遇到困难,也许可以问另一个问题,并且请使其非常集中。