printf里面有CUDA __global__函数

我目前正在GPU上编写矩阵乘法并想调试我的代码,但由于我无法在设备函数中使用printf,我还能做些什么来查看该函数内部的内容。 这是我目前的function:

__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。

编辑结束

你有选择:

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

关于你的代码片段:

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

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

顺便说说..

  • 使用共享内存
  • 在循环外加倍
  • 看看这个: http : //www.seas.upenn.edu/~cis665/LECTURES/Lecture11.ppt

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

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