如何通过 GPU 并行(CUDA)打印来跟踪变量

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

当您并行打印时,(CUDA) 所有线程都会立即触发。

这使得打印输出时很难跟踪变量,因为输出本质上是无序的。

代替:

  • t1 输出_1
  • t1 输出_2
  • t1 输出_3

你得到:

  • t1 输出_1
  • t2 输出_1
  • t3 输出_1

您可以想象,当您有数十个线程运行 10 行代码并推送实际上 1000 行输出时,这是多么困难。

到目前为止,我只是在一行中打印了内核的所有变量。
我已经遇到了这样做的问题,可以看出 这里

我能想到的唯一其他解决方案是标记每一行,输出到文本文件,并编写一个程序来重新排序数据。 这将非常耗时且处理繁重。

当打印并行触发时,是否有更好的方法来打印数据以跟踪变量?我在普通 C 中使用 Nvidia 的 cuda 工具包。

debugging printing parallel-processing cuda
1个回答
0
投票

确保在每个打印语句的末尾包含一个

'\n'
,并使用线程信息标记每一行。

我使用以下代码进行打印。

#define println(format, ...) \
  printf("T:%02i W:%02i B:%02i Line:%4i " format "\n", \ 
    threadIdx.x, threadIdx.x / 32, blockIdx.x, __LINE__, __VA_ARGS__)
//note no trailing ;

如果您在带有尾随

printf
的单个
\n
语句中进行打印,CUDA 将始终将该行与其他线程的行分开打印,并且永远不会混合打印。

不要将打印分成多行,因为这样其他线程的输出将会散布。
如果您发现需要的参数多于现有的 32 - 4 = 28,那么您可以执行

format
,创建一些子字符串,然后使用
%s
参数粘贴到您的
printf
中。或者,更好的是打印更多行。

这可能会使您的输出更加冗长,但您始终可以对它们进行后处理。线程信息的标记至关重要,否则输出对调试毫无用处。

也就是说,我建议不要在后处理中对输出重新排序,因为您会丢失排序信息(哪些线程以什么顺序运行),这在调试问题时非常有用。

© www.soinside.com 2019 - 2024. All rights reserved.