CUDA __global__ 函数中的 printf

问题描述 投票:0回答:5

我目前正在 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
5个回答
82
投票

CUDA 现在直接在内核中支持

printf
。 有关正式描述,请参阅CUDA C 编程指南的附录 B.16。


17
投票

编辑

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

编辑结束

你有选择:

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

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

4
投票
    cuprintf
  • 尝试 Nexus
  • http://developer.nvidia.com/object/nexus.html
顺便说一句..

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

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

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


0
投票
int start = 1000; int end = 1999; int size = end - start +1; vector<int> array123(size); for (int i = 0; i < size; i++) { array123[i] = start + i; } int* input; int* output; int* count; cudaMalloc((void**)&input, size * sizeof(int)); cudaMalloc((void**)&output, size * sizeof(int)); cudaMalloc((void**)&count, sizeof(int)); cudaMemset(count, 0, sizeof(int)); cudaMemcpy(input, array123.data(), size * sizeof(int), cudaMemcpyHostToDevice);
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.