printf inside CUDA __global__ function

泄露秘密 提交于 2020-01-10 12:03:09

问题


I am currently writing a matrix multiplication on a GPU and would like to debug my code, but since I can not use printf inside a device function, is there something else I can do to see what is going on inside that function. This my current 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;
}

I would love to know if Ad and Bd is what I think it is, and see if that function is actually being called.


回答1:


EDIT

To avoid misleading people, as M. Tibbits points out printf is available in any GPU of compute capability 2.0 and higher.

END OF EDIT

You have choices:

  • Use a GPU debugger, i.e. cuda-gdb on Linux or Nexus on Windows
  • Use cuprintf, which is available for registered developers (sign up here)
  • Manually copy the data that you want to see, then dump that buffer on the host after your kernel has completed (remember to synchronise)

Regarding your code snippet:

  • Consider passing the Matrix structs in via pointer (i.e. cudaMemcpy them to the device, then pass in the device pointer), right now you will have no problem but if the function signature gets very large then you may hit the 256 byte limit
  • You have inefficient reads from Ad, you will have a 32-byte transaction to the memory for each read into Melement - consider using shared memory as a staging area (c.f. the transposeNew sample in the SDK)



回答2:


CUDA now supports printfs directly in the kernel. For formal description see Appendix B.16 of the CUDA C Programming Guide.




回答3:


  • cuprintf
  • try Nexus http://developer.nvidia.com/object/nexus.html

by the way..

  • use shared memory
  • multiply outside of the loop
  • Look at this: http://www.seas.upenn.edu/~cis665/LECTURES/Lecture11.ppt



回答4:


See "Formatted output" (currently B.17) section of CUDA C Programming Guide.

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



来源:https://stackoverflow.com/questions/2173771/printf-inside-cuda-global-function

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!