printf里面有CUDA __global__函数

时间:2010-01-31 23:03:50

标签: 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;
}

我很想知道Ad和Bd是否符合我的想法,并查看该功能是否实际被调用。

4 个答案:

答案 0 :(得分:71)

CUDA现在直接在内核中支持printf。有关形式描述,请参阅CUDA C Programming Guide的附录B.16。

答案 1 :(得分:16)

修改

为避免误导人们,正如M. Tibbits所指出的,printf可用于任何计算能力2.0及以上的GPU。

END OF EDIT

您有选择:

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

关于您的代码段:

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

答案 2 :(得分:4)

顺便说一句..

答案 3 :(得分:2)

请参阅“CUDA C编程指南”的“格式化输出”(当前为B.17)部分。

http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html