【问题标题】:On the order of CUDA printf outputs关于 CUDA printf 输出的顺序
【发布时间】:2016-02-22 01:54:22
【问题描述】:

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

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

no code

我做错了什么?

【问题讨论】:

    标签: parallel-processing cuda


    【解决方案1】:

    由于您有一个非常小的内核,其中仅包含 1 个块和 6 个线程,因此所有线程都在一个 warp 中运行。在一个warp中,不同的线程必须互相等待。 详情请参阅编程指南。

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

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

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

    【讨论】:

    • 是的,如果您使用Procesas<<<6,1>>> 并让int id = blockIdx.x。那么你可能会遇到杰克回答中提到的同花顺问题。
    • 但是打印文本是使用 GPU 的一种非常糟糕的方式
    • 我知道这是非常糟糕的方式,但这是一项任务,我应该尽我所能:) 好的,Procesas<<<6,1>>> 完成了这项工作,非常感谢你!但是有什么方法可以与1,6 并行打印,因为给我这个任务的人说我应该增加线程数,而不是块?
    • <<<1,6*32>>> 可能能够做到这一点,因为 warp 只包含 32 个线程。
    【解决方案2】:

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

    编辑

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

    也看看这个其他线程

    CUDA : unexpected printf behavior

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

    【讨论】:

    • 我需要根据这个进行更改才能并行打印?对不起,我没听懂..
    • @Eddwhis 我之前的回答有太多无用的信息。我已经编辑了帖子以更好地关注问题。
    猜你喜欢
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2015-02-15
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    相关资源
    最近更新 更多