NVIDIA GPU上cuda Kernel的峰值吞吐量

时间:2011-08-06 09:25:46

标签: cuda opencl gpu gpgpu

我对GPU上运行的内核的吞吐量有疑问。假设其占用率为0.5,块大小为256:编程指南指出最好有多个块,以便它们可以隐藏内存延迟等。但我不明白为什么这是正确的。因为只要内核每个流多处理器具有多个warp = 24,即3个块,它就会达到峰值吞吐量。因此,拥有超过24个warp(或3个块)不会改变吞吐量。

我错过了什么吗?任何人都可以纠正我吗?

2 个答案:

答案 0 :(得分:6)

虽然低占用率的SM确实无法充分隐藏延迟,但重要的是要理解这一点:

更高的占用率!=更高的吞吐量!

占用率只是衡量SM在任何特定时刻可供选择的工作量的指标。拥有更多驻留warp使SM能够更有能力完成有用的工作,而其他warp正在等待结果(内存访问或计算结果 - 都具有非零延迟)。

吞吐量衡量每秒完成的工作量,虽然它可能受到延迟(因此占用率)的限制,但它也可能受到内存带宽,指令吞吐量(执行单元数量)和其他因素。

编程指南说明拥有多个线程块而不仅仅是一个大线程块更好的原因是因为有时能够不仅从其他warp而且从其他块发出工作更好。这是一个例子:

想象一下,您的大线程块必须从全局内存加载数据(高延迟)并将其存储到共享内存(低延迟),然后必须立即执行__syncthreads()。在这种情况下,当warp完成加载其数据并将其写入共享内存时,它必须等到块中的所有其他线程完成相同操作。对于大块,可能需要一段时间。但是如果有多个较小的线程块占用SM,则SM可以在等待第一个块中的__syncthreads等待时切换并从其他块开始工作。这有助于缩短GPU空闲时间并提高效率。

你不一定要拥有非常小的块(因为Fermi上的SM支持最多8个驻留块),但是拥有128-512个线程的块通常比使用1024个线程的块更有效。

答案 1 :(得分:1)

如果您的cuda启用卡中只有一个 SM,则超过3个块不会改变您的情况下的吞吐量。通常,您在一个GPU中有8个或更多SM。

另外,在一个SM上运行的块数不仅仅取决于warp的数量。这只是一个限制因素,还有许多其他因素。 CUDA Occupancy Calculator是查看内核占用情况的绝佳工具。