我目前正在 GPU 上编写矩阵乘法,并想调试我的代码,但由于我无法在设备函数内使用 printf,我还可以做些什么来查看该函数内部发生了什么。这是我当前的功能:
__global__ void MatrixMulKernel(Matrix Ad, Matrix Bd, Matrix Xd){
int tx = threadIdx.x;
int ty = threadIdx.y;
int bx = blockIdx.x;
int by = blockIdx.y;
float sum = 0;
for( int k = 0; k < Ad.width ; ++k){
float Melement = Ad.elements[ty * Ad.width + k];
float Nelement = Bd.elements[k * Bd.width + tx];
sum += Melement * Nelement;
}
Xd.elements[ty * Xd.width + tx] = sum;
}
我很想知道 Ad 和 Bd 是否如我所想,并查看该函数是否确实被调用。
编辑
为了避免误导人们,M. Tibbits 指出 printf 在任何计算能力 2.0 及更高版本的 GPU 中都可用。
编辑结束
你有选择:
Matrix
结构(即
cudaMemcpy
它们到设备,然后传入设备指针),现在你不会有问题,但如果函数签名变得非常大,那么你可能会遇到 256字节限制
int start = 1000;
int end = 1999;
int size = end - start +1;
vector<int> array123(size);
for (int i = 0; i < size; i++)
{
array123[i] = start + i;
}
int* input;
int* output;
int* count;
cudaMalloc((void**)&input, size * sizeof(int));
cudaMalloc((void**)&output, size * sizeof(int));
cudaMalloc((void**)&count, sizeof(int));
cudaMemset(count, 0, sizeof(int));
cudaMemcpy(input, array123.data(), size * sizeof(int), cudaMemcpyHostToDevice);