29

我目前正在 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

4 回答 4

77

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

于 2011-07-05T17:10:57.277 回答
17

编辑

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

编辑结束

你有选择:

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

关于您的代码段:

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

顺便一提..

于 2010-02-09T00:00:26.130 回答
2

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

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

于 2013-10-29T19:47:19.477 回答