【问题标题】:CUDA threads are executed in the same order they startCUDA 线程按照它们启动的顺序执行
【发布时间】:2017-08-26 14:18:40
【问题描述】:

CUDA 并行块每次都从头到尾执行是否正常?我的意思是:

如果我有 3 个线程,我总是会得到这个:

• 第一个线程结束。 • 第二个线程完成。 • 第三个线程完成。

我想知道这是否是正常行为,因为我是 CUDA 的新手。我知道 Open MP、C++ 线程或 Java 线程通常每次都会给出不同的结果。但在 CUDA 中,我总是得到相同的订单。那可能吗?或者这意味着某些东西不能很好地工作?

【问题讨论】:

    标签: cuda


    【解决方案1】:

    CUDA 不对此行为提供任何保证。

    由于 32 个线程被分组到 warp 中,您可能会在那里观察到典型或可重复的行为,但如果您启动 300 万个线程,您会观察到每次运行的不同顺序。

    【讨论】:

    • 嗯,我实际上有 10 个线程,并且已经运行了大约 100 次并且总是得到相同的结果。从 1 到 10。当一切正常时还会发生这种情况吗? :)
    • 是的。 Warp 是由 32 个线程组成的组,它们以锁步方式执行(您可能想阅读我在回答中提供的文档的 warp 链接)。所以他们的行为可能更容易预测。如果您启动 64 个线程,您甚至可能看不到太多差异。但是如果你启动 300 万个线程,你会看到行为上的差异。
    【解决方案2】:

    如果这些线程在同一个warp中,它们将在锁步中执行,顺序由硬件决定,很可能是从0到31。

    如果这些线程在不同的warp中但在同一个线程块中,则warp调度器确定的顺序将是不可预测的。

    如果这些线程在不同的线程块中,块调度器确定的顺序将是不可预测的。

    【讨论】:

    • 是否有可能以某种方式检查线程是否在同一个经线中?我测试了一下,可以保证它们在同一个块,编号为0。我也想知道是否可以强制线程在不同的块中执行,我可以得到一个随机顺序?
    • @user3111627 对于您的第一个问题,满足(线程 ID % 32)的线程在同一个经线中是相同的。对于第二个问题,当你启动内核时,只需将块号设置为大于 1,每个块只包含 1 个线程。这样,您可以获得随机订单。如果你很好地理解了warp、blocks和multiprocessors的概念,你就可以说得清楚了。
    • 你确实需要了解warp/block/SM的概念。给定块中的线程被分组为 32 个线程的“warp”(到目前为止它总是 32;将来可能会改变?),它们以锁步执行,即它们都执行指令 0,然后是 1,然后是 2,等等。你真的没有其他保证;特别是,我认为对于块内的扭曲顺序没有任何保证。
    • @RobertCrovella 对,CUDA 不保证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 2016-05-17
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多