printf里面有CUDA __global__函数

Jos*_*ega 24 c c++ cuda gpu-programming

我目前正在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;
}
Run Code Online (Sandbox Code Playgroud)

我很想知道Ad和Bd是否是我认为的,看看是否真的被调用了.

M. *_*its 74

CUDA现在printf直接在内核中支持s.有关形式描述,请参阅" CUDA C编程指南"的附录B.16 .

  • 注意:"now"表示计算能力2.x或更高. (13认同)
  • 我认为链接不再指向正确的位置.这是一个替代链接:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#formatted-output (12认同)
  • 因此,您需要传递一个参数`-arch sm_20`或类似于`nvcc`,否则它将无法在`__global__`函数中编译. (4认同)

Tom*_*Tom 17

编辑

为了避免误导人们,正如M. Tibbits所指出的,printf可用于任何计算能力2.0及更高版本的GPU.

编辑结束

你有选择:

  • 使用GPU调试器,即Linux上的cuda-gdb或Windows上的Nexus
  • 使用cuprintf,可供注册开发人员使用(在此处注册)
  • 手动复制要查看的数据,然后在内核完成后将该缓冲区转储到主机上(记得同步)

关于你的代码片段:

  • 考虑Matrix通过指针传递结构(即cudaMemcpy它们到设备,然后传入设备指针),现在你没有问题,但如果函数签名变得非常大,那么你可能会达到256字节的限制
  • 你从Ad读取效率低,每次读入Melement时你都会有一个32字节的内存事务 - 考虑使用共享内存作为暂存区域(参见SDK中的transposeNew示例)