当您并行打印时,(CUDA) 所有线程都会立即触发。
这使得打印输出时很难跟踪变量,因为输出本质上是无序的。
代替:
你得到:
您可以想象,当您有数十个线程运行 10 行代码并推送实际上 1000 行输出时,这是多么困难。
到目前为止,我只是在一行中打印了内核的所有变量。
我已经遇到了这样做的问题,可以看出
这里
我能想到的唯一其他解决方案是标记每一行,输出到文本文件,并编写一个程序来重新排序数据。 这将非常耗时且处理繁重。
当打印并行触发时,是否有更好的方法来打印数据以跟踪变量?我在普通 C 中使用 Nvidia 的 cuda 工具包。
确保在每个打印语句的末尾包含一个
'\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
中。或者,更好的是打印更多行。
这可能会使您的输出更加冗长,但您始终可以对它们进行后处理。线程信息的标记至关重要,否则输出对调试毫无用处。
也就是说,我建议不要在后处理中对输出重新排序,因为您会丢失排序信息(哪些线程以什么顺序运行),这在调试问题时非常有用。