我读到可以使用内核启动来同步不同的块,即,如果我希望所有块在继续操作 2 之前完成操作 1,我应该将操作 1 放在一个内核中,将操作 2 放在另一个内核中。这样,我就可以实现块之间的全局同步。然而,cuda c 编程指南提到内核调用是异步的,即。 CPU 不会等待第一个内核调用完成,因此,CPU 还可以在第一个内核调用完成之前调用第二个内核。但是,如果这是真的,那么我们就不能使用内核启动来同步块。请让我知道我哪里出错了
从 CPU 的角度来看,内核调用是异步的,因此如果连续调用 2 个内核,第二个内核将被调用,而无需等待第一个内核完成。它仅意味着控制权立即返回到CPU。
在 GPU 方面,如果您没有指定不同的流来执行内核,它们将按照调用的顺序执行(如果您没有指定流,它们都会转到默认流并串行执行)。只有在第一个内核完成后,第二个内核才会执行。
此行为对于具有支持并发内核执行的计算能力 2.x 的设备有效。在其他设备上,即使内核调用仍然是异步的,内核执行也始终是顺序的。
检查 CUDA C 编程指南第 3.2.5 节,每个 CUDA 程序员都应该阅读。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)