Nvidia web-site提到了占用率低的一些原因,其中包括块之间工作负载的不均匀分布,这导致块囤积共享内存资源并且在块完成之前不释放它们。建议是减小块的大小,从而增加块的总数(假设我们保持线程数不变,当然)。
在stackoverflow上也给出了here的一个很好的解释。
鉴于上述信息,不应该采取正确的行动方案(为了最大限度地提高性能),只需将块的大小设置得尽可能小(等于经线的大小,比如32个线程)?也就是说,除非你需要确保大量的线程需要通过共享内存进行通信,否则我认为。
答案 0 :(得分:2)
鉴于上述信息,不应该是正确的过程 动作(为了最大限度地提高性能)只需设置大小 尽可能小的块(等于经线的大小,比如说32 线程)?
没有。
如文档here所示,每个多处理器的块数有一个限制,当使用32个线程块时,这将使您的最大理论占用率为25%或50%,具体取决于硬件你运行内核。
答案 1 :(得分:0)
通常,这是一种很好的方法,可以像小块一样使用,但又大到足以使设备饱和(每个块64或128个线程,具体取决于设备) - 由于您可能希望同步线程或通过共享进行通信,因此并不总是可行的存储器中。
拥有大量小块允许GPU进行“自动平衡”并保持所有SM运行。
这同样适用于CPU - 如果你有5个独立的玩家并且每个玩家需要4秒才完成,但是你只有4个核心,那么它将在8秒后结束(在前4秒内4个核心在前4个任务上运行然后在最后一个任务上运行1个核心,3个核心空闲。 如果你能够将整个工作划分为20个任务,需要1秒钟,那么整个工作将在5秒内完成。因此,有很多小任务有助于利用硬件。
对于GPU,您可以拥有大量活动块(在Titan X上它是24个SM x 32个活动块= 768个块)并且可以使用此电源。 无论如何,你需要完全饱和设备并不总是如此。在许多任务中,我可以看到每个块使用32个线程(因此具有50%可能的占用率)与每个块使用64个线程相同。 最后,所有这些都需要做一些基准测试,并在给定硬件的情况下选择最适合您的任何基准。