1

CUDA C 编程指南提供以下语句:

对于支持并发内核执行且计算能力为 3.0 或更低的设备,任何需要依赖项检查以查看流内核启动是否完成的操作:

‣ 只有当所有先前内核的所有线程块从 CUDA 上下文中的任何流启动时,才能开始执行;

‣ 阻止所有以后从 CUDA 上下文中的任何流启动内核,直到检查内核启动完成。

我在这里很迷茫。什么是依赖检查?我可以说在某些设备内存上执行内核需要对所有先前的内核或涉及相同设备内存的内存传输进行依赖性检查吗?如果这是真的(也许不是真的),这个依赖检查会根据上面的语句从任何其他流中阻塞所有以后的内核,因此之后不会发生异步或并发执行,这似乎不正确。

任何解释或阐述将不胜感激!

4

1 回答 1

4

首先,我建议您访问 nvidia 的网络研讨会站点并观看有关并发和流的网络研讨会。

进一步考虑以下几点:

  • 发布到同一流的命令被视为依赖

    例如,您可以在该内核将访问的一些数据的内存副本之后将内核插入流中。内核“取决于”可用的数据。

  • 因此,可以保证同一流中的命令按顺序执行(或同步执行,通常用作同义词)
  • 然而,不同流中的命令是独立的,可以同时运行
  • 所以依赖关系只有程序员知道,并使用流表示(以避免错误)!

以下仅对应于计算能力为 3.0 或更低的设备(如 quide 中所述)。如果您想了解更多关于计算能力 3.5 对流调度行为的更改,请查看HyperQ和相应的示例。在这一点上,我还想参考这个我找到 HyperQ 示例的线程 :)

关于您的第二个问题:我不太明白您所说的“在某些设备内存上执行内核”或“涉及设备内存的内核执行”是什么意思,所以我将您的陈述简化为:

内核执行需要对所有先前的内核和内存传输进行依赖性检查。

更好的是:

CUDA 操作需要进行依赖性检查,以查看同一流中的先前 CUDA 操作是否已完成。

我认为您的问题在于“开始执行”的表达。这意味着仍然可以有独立的(即在不同的流上)内核启动,这与以前的内核并发,前提是它们都已开始执行并且有足够的设备资源可用。

于 2013-04-30T17:33:53.773 回答