我是新的数据自动化系统,我试图做平行打印与数据自动化系统printf。
在下面的示例中,我有6线程和6数据数组,我需要在CUDA中“同时”打印所有6数组。每个数组都应该分配给将打印它的1线程。我尝试了一个多星期,却不知道如何去做,因为我总是得到连续排列的结果:第一个数组打印第一个数组,第二个数组打印第二个等等。然而,我想观察混合打印,以证明并行执行的“随机性”。这是我的代码:
no code我做错了什么?
发布于 2013-09-26 15:35:35
因为您有一个非常小的内核,只包含一个带6个线程的块,所以所有的线程都在一个翘曲中运行。在经纱内,不同的线程必须互相等待。有关详细信息,请参阅编程指南。
http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#simt-architecture
一个翘曲一次执行一个公共指令,所以当一个翘曲的所有32个线程都同意它们的执行路径时,就能实现完全的效率。如果翘曲的线程通过依赖于数据的条件分支发散,则翘曲会依次执行所采取的每个分支路径,禁用不在该路径上的线程,并且当所有路径完成时,这些线程将收敛到相同的执行路径。分支发散只在翘曲中发生;不同的翘曲是独立执行的,不管它们是执行公共的还是不相交的代码路径。
因此,您的数据将按照相同的代码顺序打印出来(首先是if(id==1){...},然后是if(id==2){...},.)。
发布于 2013-09-26 15:31:40
看看CUDA C编程指南,第113-114页:它提供了一些关于printf如何刷新其输出的信息。
编辑
此外,根据Eric的回答,通过printf,您将只看到一个“粒状”的随机性,这种随机性与翘曲执行的随机性有关。一切都在里面,经纱似乎是有序的。
也可以查看另一个线程。
CUDA : unexpected printf behavior
在这里,Robert解释了CUDA printf输出背后的逻辑。
https://stackoverflow.com/questions/19031970
复制相似问题