我在想,如果我在一个流中运行一个包含10个包含1000个线程的块的内核来分析一个数据数组,然后启动一个需要包含10个包含1000个线程的块的内核来分析第二个流中的另一个数组,会发生什么情况?
卡上的非活动线程是否将开始分析我的第二个数组?或者第二个流将被暂停,直到第一个流必须结束?
谢谢。
发布于 2013-02-25 09:36:38
一般来说,如果内核是从同一应用程序和all requirements for execution of concurrent kernels are met的不同(非默认)流发出的,并且有足够的可用资源(SMs,尤其是--我猜这就是您所说的“非活动线程”)来调度这两个内核,那么第二个内核的一些块将开始沿着已经执行的第一个内核的块执行。这可能发生在第一个内核的块已经调度到的同一个SMs上,或者可能发生在其他未占用的SMs上,或者两者兼而有之(例如,如果您的GPU有14个SMs,工作分配器将在10个SMs上分发第一个内核的10个块,剩下4个在这一点上未使用)。
另一方面,如果你的内核有需要32KB共享内存使用的线程块,而你的GPU有8个SMs,那么第一个内核的线程块将有效地“用完”这8个SM,而第二个内核的线程块将不会开始执行,直到第一个内核的一些线程块“耗尽”,即完成并退出。这只是可能抑制并发执行的资源利用的一个示例。当然,如果你启动的内核都有很多线程块(比如100个或更多),那么第一个内核将占据整个机器,而第二个内核直到第一个内核基本完成后才会开始执行。
如果你在右上角搜索"cuda并发内核“,你会发现一些问题,这些问题突出了与观察并发内核执行相关的一些挑战。
https://stackoverflow.com/questions/15058238
复制相似问题