cuda printf

  • 4 replies
  • 596 views
cuda printf
« 于: 二月 12, 2020, 06:59:29 pm »
在计算能力2.0之后,CUDA具有了直接printf的能力

在计算程序运行时间时,考虑到printf主要时间到底是花费在在CPU还是GPU上。

我不知道在CUDA中使用printf,是否传回到主机一些指令或数据

希望有高手可以解答一下CUDA中 printf的实现原理。

Re: cuda printf
« 回复 #1 于: 二月 12, 2020, 07:28:55 pm »
在计算能力2.0之后,CUDA具有了直接printf的能力

在计算程序运行时间时,考虑到printf主要时间到底是花费在在CPU还是GPU上。

我不知道在CUDA中使用printf,是否传回到主机一些指令或数据

希望有高手可以解答一下CUDA中 printf的实现原理。

(1)printf的确回传的,而且遵照你的平台上的格式描述符。例如你可以查看64-bit下的windows和linux的%ld的情况。看看kernel在Windows和Linux上的时候,%ld为何不一样。
(2)实现细节NV没有提供,暂时无法知道。
(3)试图测试或者优化大量的kernel中的printf,往往证明你选错了方向。这只是一个辅助使用的小函数,不是用来给你海量格式化大量的文本输出的(如果需要海量文本输出,请自行实现)。这种想法已经在本论坛被人想了无数次了,并不存在直接能用的,大规模的并行printf。

此外,大规模的并行printf往往无意义,因为:
(1)格式化后的文本是给人看的,人不能海量的查看文本。例如在GPU中1MB的数据量小如猴毛,而你肉眼看1MB的文本会挂掉的。

(2)机器并不需要这样(它可以直接使用原始数据,比你格式化+解析格式两步走,快得多)

所以一般这种设想往往都代表你想错了方向,而不是能不能大规模的并行化输出文本的问题。

Re: cuda printf
« 回复 #2 于: 二月 12, 2020, 08:11:40 pm »
(1)printf的确回传的,而且遵照你的平台上的格式描述符。例如你可以查看64-bit下的windows和linux的%ld的情况。看看kernel在Windows和Linux上的时候,%ld为何不一样。
(2)实现细节NV没有提供,暂时无法知道。
(3)试图测试或者优化大量的kernel中的printf,往往证明你选错了方向。这只是一个辅助使用的小函数,不是用来给你海量格式化大量的文本输出的(如果需要海量文本输出,请自行实现)。这种想法已经在本论坛被人想了无数次了,并不存在直接能用的,大规模的并行printf。

此外,大规模的并行printf往往无意义,因为:
(1)格式化后的文本是给人看的,人不能海量的查看文本。例如在GPU中1MB的数据量小如猴毛,而你肉眼看1MB的文本会挂掉的。

(2)机器并不需要这样(它可以直接使用原始数据,比你格式化+解析格式两步走,快得多)

所以一般这种设想往往都代表你想错了方向,而不是能不能大规模的并行化输出文本的问题。

那是不是说明在GPU中进行输出,和传回到CPU再进行printf是一样的,效率是一样的。

即,在GPU中直接输出,相当于将GPU中的数据进行传回,并在CPU中执行打印指令。

我不是想直线大规模并行输出的优化,只是想知道cuda printf的具体实现大概步骤

Re: cuda printf
« 回复 #3 于: 二月 12, 2020, 09:22:17 pm »
那是不是说明在GPU中进行输出,和传回到CPU再进行printf是一样的,效率是一样的。

即,在GPU中直接输出,相当于将GPU中的数据进行传回,并在CPU中执行打印指令。

我不是想直线大规模并行输出的优化,只是想知道cuda printf的具体实现大概步骤

对于用户来说,就算是回传数据,然后显示在你的终端窗口里(这步显然需要CPU参与的),也和你手工回传然后显示不一样。

前者:你可以在kernel的任意时刻进行一次printf调用,方便的直接输出。由CUDA自己负责安排多个线程之间的都有哪些数据需要被准备,又是什么格式。当前kernel运行期间因为不能暂停,临时性的又将数据放到哪里。kernel结束后,检查是否又有需要回传的东西,回传,然后调用host上的printf。

后者:你这一切都需要自己来。是否效率一样,看你自己实现。

此外,关于你询问的CUDA的printf的内部实现细节,抱歉,这个暂无资料。你可以尝试直接跟NV索要。

Re: cuda printf
« 回复 #4 于: 二月 13, 2020, 01:22:04 pm »
对于用户来说,就算是回传数据,然后显示在你的终端窗口里(这步显然需要CPU参与的),也和你手工回传然后显示不一样。

前者:你可以在kernel的任意时刻进行一次printf调用,方便的直接输出。由CUDA自己负责安排多个线程之间的都有哪些数据需要被准备,又是什么格式。当前kernel运行期间因为不能暂停,临时性的又将数据放到哪里。kernel结束后,检查是否又有需要回传的东西,回传,然后调用host上的printf。

后者:你这一切都需要自己来。是否效率一样,看你自己实现。

此外,关于你询问的CUDA的printf的内部实现细节,抱歉,这个暂无资料。你可以尝试直接跟NV索要。

非常感谢您的回答。

通过您的回答,我了解到,在CUDA中实现printf并发。效率极低。自己实现效率同样不能保证。
CUDA将对消息进行回传。

 :)