【问题标题】:printf inside CUDA __global__ functionCUDA __global__ 函数中的 printf
【发布时间】:2011-01-11 12:57:20
【问题描述】:

我目前正在 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 是不是我想的那样,看看是否真的调用了那个函数。

【问题讨论】:

    标签: c++ c cuda gpu


    【解决方案1】:

    CUDA 现在直接在内核中支持printfs。正式描述见CUDA C Programming Guide的附录B.16。

    【讨论】:

    • 我认为链接不再指向正确的位置。这是一个备用链接:docs.nvidia.com/cuda/cuda-c-programming-guide/…
    • 注:“now”表示计算能力2.x或更高。
    • 因此您需要传递-arch sm_20 或类似于nvcc 的参数,否则它将无法在__global__ 函数中编译。
    • 相关章节现在是 B.17,而不是 B.14。
    • ...相关部分现在是 B.16
    【解决方案2】:

    编辑

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

    编辑结束

    你有选择:

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

    关于你的代码 sn-p:

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

    【讨论】:

      【解决方案3】:

      顺便说一句..

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-03-26
          • 2013-08-23
          • 1970-01-01
          • 2013-07-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多