我是CUDA的新手,我正在尝试使用CUDA进行并行打印printf
。
在下面的示例中,我有6
个线程和6
数据数组,我需要在CUDA中同时打印所有6
数组。应将每个数组分配给将打印它的1
线程。我正在尝试超过一个星期并且不知道如何做到这一点,因为总是我得到连续排序的结果:第一个阵列打印第一个,第二个阵列打印第二个等等。但是,我想观察混合打印,以证明并行执行的“随机性”。这是我的代码:
no code
我做错了什么?
答案 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
输出背后的逻辑。