CUDA:为什么每个块有超过8个线程有好处?

Dig*_*Gal 4 cuda

我是一名使用CUDA进行数值积分的数学家.我的理解是每个Nvidia流多处理器都有8个CUDA核心.所以对我来说,每个块使用超过8个线程似乎没有任何好处.但是,当我运行我的代码时,通过每块使用32个线程而不是每个块8个线程,我获得了巨大的性能提升.

另外我注意到使用超过12个块有很大的收益(即使我的卡只有12个流多处理器).

是否有一个原因?

Pat*_*k87 8

talonmies和chaohuang在评论中提供了很好的信息,你应该调查一下(不知道为什么这些不是答案,但这是他们的电话).无论如何,我将提供一个简短的部分答案来解释您可能不会考虑的事情.

假设您有8个控制线程和8个处理器.如果所有8个线程中的所有指令都是仅占用一个周期的片上指令,那么所有8个线程将以n周期结束(假设n每个线程有总指令).

现在让我们说每个控制线程都包含n指令,其中一小部分r是片外存储器指令,例如需要100个周期才能完成.这8个线程现在将[(1 - r) + 100r]n完成周期.如果r=0.1,这比前一个案例大约多11倍.

现在让我们说我们有16个线程.当第一批8个线程在慢速操作时被阻塞时,其他线程可以执行; 可以执行片上指令,并且可以启动片外指令.因此2[(1 - r) + 100r]n,您可能只需要多一点,而不需要循环来完成所有线程[(1 - r) + 100r]n.本质上,因为你有一些空间来重叠等待线程与其他线程,你可以免费添加更多线程.

这是GPU模型的强大优势:克服长延迟的大规模并行性.做一点工作需要很长时间,但没有多少时间做更多的工作.请注意,当您的算术强度(与r上述公式相关)很高时,与您准备隐藏延迟的工作量(线程)相关的占用率对于峰值性能并不是那么重要.您可以使用CUDA占用计算器来查看我针对不同场景所描述的效果.