了解CUDA依赖性检查

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

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

only只有在CUDA上下文中任何流的所有先前内核启动的所有线程块都已开始执行时才能开始执行;

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

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

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


首先我建议你访问NVIDIA的网络研讨会网站,并观看并发与流媒体研讨会。

另外考虑以下几点:

  • 发布到同一个流的命令被视为从属

    例如, 内核将访问某些数据的memcopy 之后,您会将内核插入流中。 内核“依赖于”可用的数据。

  • 因此,确保相同流中的命令按顺序执行(或同步执行,通常用作同义词)
  • 不同流中的命令是独立的,可以同时运行
  • 所以只有程序员才知道依赖关系,并使用流来表示(避免错误)!
  • 以下仅对应于计算能力为3.0或更低的设备(如问题所述)。 如果您想了解更多关于流计划功能的流调度行为的更改,请参阅HyperQ和相应示例。 在这一点上,我也想引用这个线程,我发现了HyperQ的例子:)

    关于第二个问题:我不太明白“某些设备内存上的内核执行”或“涉及设备内存的内核执行”的含义,因此我将语句缩减为:

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

    更好的是:

    CUDA操作需要依赖性检查,以查看同一个流中 CUDA操作先前完成情况。

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

    链接地址: http://www.djcxy.com/p/80105.html

    上一篇: Understanding CUDA dependency check

    下一篇: cuda kernels not executing concurrently