C中的线程块和流多处理器

时间:2015-02-23 20:10:15

标签: cuda

有人告诉我,为了拥有一个完全高效的CUDA C程序,线程块的数量应至少是流多处理器数量的3或4倍。

我的问题是:陈述是真的吗?如果是/否为什么?这个比例理想上应该是什么?

1 个答案:

答案 0 :(得分:2)

当内核启动时,通常可以在每个SM上启动多个线程块。

GPU是一种延迟隐藏机器。为了隐藏延迟,它需要尽可能多的潜在工作。潜在的工作可以转化为“准备执行的经线”。通过为每个SM提供多个线程块,可以最大化此方案。

在某些时候,GPU(SM)耗尽资源来托管其他线程块。每个SM大约3-4个线程块可能会出现此跳出点,具体取决于线程块的资源使用情况(寄存器,线程,共享内存等)和GPU类型的具体情况。因此,启动超过可以在SM上实际调度的数量将无助于并行程序的并发性,延迟隐藏,占用或其他品质因数。这些线程块只会等到SM上的调度槽打开。

没有固定的比率,但是对每个块具有256或512个线程的典型线程块的分析表明,每个SM需要至少3-8个线程块,以最大化占用率(这也取决于GPU架构)。每个块有1024个线程,每个SM可能只需要2个线程块。

如果工作被划分为更多的线程块,GPU程序通常不会显着减慢,因此数字不是一个硬性规则,实际行为将取决于其他因素,如共享内存使用(如果有的话) 。这只是一般指导原则。