CUDA编程指南提供了以下语句:
对于支持并发内核执行且具有计算能力3.0或更低版本的设备,任何需要进行依赖项检查以查看流内核启动是否完成的操作: 只有当所有先前内核的线程块从CUDA上下文中的任何流开始执行时,‣才能开始执行; ‣阻止所有后续内核从CUDA上下文中的任何流启动,直到正在检查的内核启动完成为止。
我在这里迷路了。什么是依赖检查?我是否可以说,在某些设备内存上执行内核需要对所有以前的内核进行依赖检查,或者对涉及相同设备内存的内存进行传输?如果这是真(可能不是真),则根据上述语句,此依赖项检查将阻塞来自任何其他流的所有以后的内核,因此以后不会发生异步或并发执行,这似乎不正确。
如有任何解释或详细说明,将不胜感激!
发布于 2013-04-30 17:33:53
首先,我建议您访问nvidia的网站-网站,并在并发和流上观看网络研讨会。
此外,还应考虑以下几点:
以下仅对应于具有计算能力3.0或更低的设备(如quide中所述)。如果您想更多地了解对流调度行为的更改,使用计算能力3.5,请查看HyperQ和相应的示例。此时,我还想参考这线程,在其中我找到了HyperQ示例:)
关于您的第二个问题:我不太明白您所说的“某些设备内存上的内核执行”或“涉及设备内存的内核执行”是什么意思,所以我将您的语句简化为:
内核执行需要对所有以前的内核和内存传输进行依赖检查。
最好是:
CUDA操作需要进行依赖项检查,以查看前面在同一流中的操作是否已经完成。
我认为你在这里的问题是“开始执行”这个短语。这意味着仍然可以有独立的内核启动(即在不同的流上),如果这些内核都已经开始执行和足够的设备资源,那么内核的启动将是与以前内核并行的。
https://stackoverflow.com/questions/15084141
复制相似问题