【问题标题】:CUDA concurrent kernel execution behavior and efficencyCUDA并发内核执行行为和效率
【发布时间】:2017-04-08 01:31:54
【问题描述】:

我还没有 CUDA 卡,我现在必须专注于 OpenCL。所以……我想我最好问问……

1.内核是否按照我调用它们的顺序执行?

如果我通过流 0 调用 A,通过流 1 调用 B,通过流 0 调用 C,通过流 1 调用 D,通过流 0 调用 E,是否确保设备按 A、B、C、D 的顺序查看内核?是吗?

如果我通过流 0 调用内核 A 和 B,然后通过流 1 调用内核 C,B 会阻塞 C 吗?我是否必须按 A、C、B 的顺序调用它们以允许 C 与 A 和 B 并发运行?

2。如果我希望内核同时运行,是否会有任何停顿或惩罚?

在 AMD 卡上,队列间依赖似乎非常昂贵(我可能错了。实际上我希望我错了。但是没有人能告诉我我是否正确。) 如果我有内核 A、B 和 C,而 A 和 B 是独立的,而 C 依赖于 A 和 B。在 AMD 卡上,如果我让 D 等待 A 或 B,将会有很大的延迟,这使得同步执行非常多几乎在所有情况下都更快。

我现在理解的是,一张 CUDA 卡只有一个计算队列。也就是说,我可以使用调用内核的顺序而不是 AMD 卡上的事件来表达依赖关系。会不会更高效甚至免罚?

【问题讨论】:

    标签: concurrency parallel-processing cuda


    【解决方案1】:

    这取决于您创建的命令队列。如果它是一个有序队列,那么它们将按照您提交它们的顺序按顺序执行。如果它是一个乱序队列,那么运行时可能会乱序执行它们,甚至可能同时执行。它不必。某些设备或驱动程序不支持乱序队列,只是将它们视为有序。

    管理乱序命令队列可以转移宿主应用程序的依赖负担;您需要使用事件对象来构建依赖关系图。

    获得并发执行的另一种(我认为更简单)的方法是使用多个(可能是按顺序的)命令队列。在每个中放置独立的工作,并且运行时允许同时运行内核(每个内核)。不是必须的,但如果可以,它应该。

    【讨论】:

    • 嗯...这是关于CUDA的
    • 不,是关于 OpenCL。这个问题有一个 OpenCL 标签,我在那里看到了它,但没有意识到它是关于 CUDA 的。如果你只想了解 CUDA,也许不要添加 OpenCL 标签。其中一些可能适用于 CUDA,所以我将把它留在这里。
    • 其实CUDA和OpenCL有很大的不同。看来它只有一个支持并发执行的命令队列,而内核仍然按顺序分派。反正我今天会拿到我的卡,我很快就可以自己查一下......
    【解决方案2】:
    1. 在较新的设备上,来自不同流的内核将无序执行。我在问题中描述的行为只会发生在非常古老的架构中。

    2. 内核将尽快开始执行。在不同的流中调用 A 和 B 而 B 等待 A 与在同一流中按顺序调用 A 和 B 没有明显区别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 2016-12-08
      • 2015-01-27
      • 1970-01-01
      相关资源
      最近更新 更多