按照CUDA printf输出的顺序

时间:2013-09-26 15:09:49

标签: parallel-processing cuda

我是CUDA的新手,我正在尝试使用CUDA进行并行打印printf

在下面的示例中,我有6个线程和6数据数组,我需要在CUDA中同时打印所有6数组。应将每个数组分配给将打印它的1线程。我正在尝试超过一个星期并且不知道如何做到这一点,因为总是我得到连续排序的结果:第一个阵列打印第一个,第二个阵列打印第二个等等。但是,我想观察混合打印,以证明并行执行的“随机性”。这是我的代码:

no code

我做错了什么?

2 个答案:

答案 0 :(得分:1)

由于你有一个非常小的内核只包含1个6个线程的块,所以所有线程都在warp中运行。在warp中,不同的线程必须彼此等待。 有关详细信息,请参阅编程指南。

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

  

warp一次执行一条通用指令,因此效率很高   当warp的所有32个线程都同意它们的执行时实现   路径。如果warp的线程通过数据相关的条件发散   分支,warp连续执行每个分支路径,禁用   不在该路径上的线程,当所有路径完成时,   线程会聚回同一个执行路径。分支分歧   仅在经线内发生;不同的warp独立执行   无论他们是执行公共代码还是不相交代码   路径。

因此,您的数据将按照相同的代码顺序打印出来(首先if(id==1){...},然后if(id==2){...},...)。

答案 1 :(得分:0)

查看CUDA C编程指南第113-114页:它提供了有关printf如何刷新其输出的一些信息。

修改

同样根据Eric的回答,printf只会看到“粒度”随机性,随机性与warp执行的随机性有关。一切都在经线内似乎是有序的。

还要看看这个其他帖子

CUDA : unexpected printf behavior

Robert Crovella解释了CUDA printf输出背后的逻辑。