NVIDA GPU上cuda内核的峰值吞吐量

NVIDA GPU上cuda内核的峰值吞吐量,cuda,opencl,gpu,gpgpu,Cuda,Opencl,Gpu,Gpgpu,我有一个关于运行在GPU上的内核的吞吐量的问题。假设占用率为0.5,块大小为256:《编程指南》指出最好有多个块,以便它们可以隐藏内存延迟等。但我不明白为什么这是正确的。因为一旦内核的每个流式多处理器的扭曲数=24,即3个块,它就会达到峰值吞吐量。因此,拥有超过24个扭曲(或3个块)不会改变吞吐量 我遗漏了什么吗?有人能纠正我吗?如果启用cuda的卡中只有一个SM,则具有3个以上块的吞吐量不会改变。通常在一个GPU中有8条或更多短信 此外,将在一个SM上运行的块的数量并不完全基于扭曲的数量。这只

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


我遗漏了什么吗?有人能纠正我吗?

如果启用cuda的卡中只有一个SM,则具有3个以上块的吞吐量不会改变。通常在一个GPU中有8条或更多短信


此外,将在一个SM上运行的块的数量并不完全基于扭曲的数量。这只是一个限制因素,还有许多其他因素。是查看内核占用情况的一个很好的工具。

虽然占用率低的SMs确实不能充分隐藏延迟,但了解这一点很重要:

入住率更高!=更高的吞吐量

占用率只是衡量SM在任何给定时刻可选择的工作量。拥有更多驻留扭曲使SM能够在其他扭曲等待结果(内存访问或计算的结果——两者都具有非零延迟)时执行有用的工作

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

《编程指南》指出,拥有多个线程块比只拥有一个大线程块更好的原因是,有时,能够从其他扭曲和其他块发出工作也更好。下面是一个例子:

假设您的大线程块必须从全局内存(高延迟)加载数据并将其存储到共享内存(低延迟),然后必须立即执行
\uu syncthreads()
。在这种情况下,当一个扭曲完成加载数据并将其写入共享内存时,它必须等待块中的所有其他线程完成同样的操作。对于一个大街区来说,这可能需要相当长的一段时间。但是,如果有多个较小的线程块占用SM,则SM可以在等待第一个块中满足
\u syncthreads
的同时切换并从其他块执行工作。这有助于减少GPU空闲时间并提高效率


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

那么,如果我的卡中有多个SM,吞吐量会发生什么变化?说16。我知道Cuda占用率计算器,但在这里没有帮助。我要问的是“拥有足够的扭曲(您只有活动扭曲)和拥有足够多的扭曲(您有一些活动扭曲,而其他扭曲是空闲的)有什么区别?”。我打赌答案不会那么短。好吧,我明白你说的。我相信这都是正确的。但是缺少了一些东西。请使用我的示例:占用率=0.5,块大小=256。我感觉这对于许多内核来说是常见的。这意味着我将有24个活动扭曲(或3个活动块)在GTX580中。那么,启动3个块和6个块之间的吞吐量差异是什么?差异的原因是什么?更高的占用率!=更高的吞吐量!因此,如果不了解内核瓶颈的细节,就不可能预测启动3个块和6个块之间的吞吐量差异。现在,如果ccupancy限制为0.5(通过寄存器或共享内存使用),并且你的GPU至少有6条短信,那么启动6个区块而不是3个区块应该会使你的吞吐量翻倍,因为这将使用更多的短信。通常你希望启动的区块至少与你的短信数量相同,如果不是每条短信的倍数的话。但我不认为这是你要问的……哦,对不起,我搞砸了。我想说的是每条短信3个区块,6个区块每个SM的块数(不是块的总数)。是的,我很确定这将取决于内核的瓶颈,但是如何实现?应该有一些一般情况,对吗?(假设占用率保持在0.5-实际上它不会受到块数的影响)或者简单地说,内核占用率是0.5。这意味着我可以每个SM有3个活动块。在GPU中,有16个SMs。当我总共启动48个块时,IPC(每个周期的指令数)是100。但当我总共启动64个块时,IPC是120,这种差异的原因可能是什么?我想你的意思是1.0和1.2,而不是100和120,但我猜你的块的启动时间有一些偏差,或者你的块有可变的运行时间,所以超过48个块有助于填补SMs上的一些空白在最初的3个区块中的一个或多个区块完成后,从而提高整体效率。