0

我想知道,如果我在一个流中运行一个包含 10 个 1000 个线程块的内核来分析数据数组,然后启动一个需要 10 个 1000 个线程块的内核来分析第二个流中的另一个数组,会发生什么发生?

我卡上的非活动线程是否将开始分析我的第二个阵列的过程?还是第二个流将被暂停,直到第一个流必须完成?

谢谢你。

4

1 回答 1

1

一般来说,如果内核是从同一应用程序的不同(非默认)流发出的,并且满足执行并发内核的所有要求,并且有足够的可用资源(尤其是 SM,我想这就是你意思是“非活动线程”)来调度两个内核,那么第二个内核的一些块将开始沿着已经在执行的第一个内核的块一侧开始执行。这可能发生在第一个内核的块已经调度的同一个 SM 上,也可能发生在其他未占用的 SM 上,或两者兼有(例如,如果您的 GPU 有 14 个 SM,则工作分配器将分配 10 个块10 个 SM 上的第一个内核,此时剩下 4 个未使用。)

另一方面,如果你的内核有线程块需要 32KB 的共享内存使用,而你的 GPU 有 8 个 SM,那么第一个内核的线程块将有效地“用完”这 8 个 SM,而第二个内核的线程块不会开始执行,直到第一个内核的一些线程块“耗尽”,即完成并退休。这只是可能抑制并发执行的资源利用示例之一。当然,如果你启动的内核每个都有很多线程块(比如 100 个或更多),那么第一个内核将主要占用机器,而第二个内核在第一个内核基本完成之前不会开始执行。

如果您在右上角搜索“cuda 并发内核”,您会发现许多问题突出了与观察并发内核执行相关的一些挑战。

于 2013-02-25T01:36:37.640 回答