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。
- cuprintf
- 试试Nexus http://developer.nvidia.com/object/nexus.html
顺便说说..
- 使用共享内存
- 在循环外加倍
- 看看这个: http : //www.seas.upenn.edu/~cis665/LECTURES/Lecture11.ppt
请参阅“CUDA C编程指南”的“格式化输出”(当前为B.17)部分。
http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html