0

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

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

no code

我做错了什么?

4

2 回答 2

1

由于您有一个非常小的内核,其中仅包含 1 个块和 6 个线程,因此所有线程都在一个扭曲中运行。在一个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){...},...)。

于 2013-09-26T15:35:35.480 回答
0

查看 CUDA C Programming Guide pp. 113-114:它提供了一些关于如何printf刷新其输出的信息。

编辑

同样根据 Eric 的回答,printf您只会看到“粒度”随机性,随机性与经线执行的随机性有关。经线内的所有东西都可以看起来是有序的。

也看看这个其他线程

CUDA:意外的 printf 行为

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

于 2013-09-26T15:31:40.090 回答