2011-04-10 86 views
4

我已经在cuda中编写了一个应用程序,它在每个块中使用1kb的共享内存。 由于每个SM中只有16kb的共享内存,因此总共只能容纳16个块(我是否正确理解它?),尽管一次只能调度8个块,但现在如果某个块正忙着做内存操作,所以其他块将在GPU上安排,但所有的共享内存被其他16块已经在那里调度使用,所以除非先前分配的块完全完成,否则cuda不会在同一个SM上安排更多块。或者它会将一些块的共享内存移动到全局内存,并在那里分配其他块(在这种情况下,我们应该担心全局内存访问延迟?)共享内存优化混淆

回答

7

它不起作用。这将被安排在一个单独的SM任何特定的时刻运行块的数量永远是最低如下:

  1. 8块
  2. 块,其静态和与动态分配共享数内存小于16kb或48kb,取决于GPU架构和设置。还有共享内存页面大小限制,这意味着每块分配被四舍五入到页面大小的下一个最大倍数
  3. 每个块寄存器使用的总和小于8192/16384/32678的块的数量取决于体系结构。还有寄存器文件页面大小,这意味着每块分配四舍五入到页面大小的下一个最大倍数。

这就是它的全部。没有“分页”共享内存来容纳更多的块。 NVIDIA产生一个计算占用率的电子表格,随工具包一起提供,并可单独下载。您可以在其包含的公式中看到确切的规则。它们也在CUDA编程指南的第4.2节中讨论。

+0

那么这是否意味着有时最好不要使用共享内存?因为更多的块将并行运行? – scatman 2011-04-11 09:05:26

+0

这真的取决于。共享内存慢得多,寄存器和寄存器没有存储区冲突,因此,如果可能的话,最好使用共享内存上的寄存器。共享内存的传统用途是允许块之间的线程之间的数据重用,并且在前费米时间内对此非常有效。在Fermi中,共享内存的情况可能不那么引人注目。 L1和L2高速缓存意味着你可以在不做任何事情的情况下经常在共享内存薄荷产出中获得很大的一部分,并且没有银行冲突或序列化效应需要担心。 – talonmies 2011-04-11 09:29:03

+0

因此,如果某个块在一个SM上一次调度到一个块,现在所有的warp都在等待内存操作完成,那么cuda将调度另一个block在同一个SM上(共享内存数据会发生什么情况已分配的块?),还是等待分配的块完成其操作? – peeyush 2011-04-11 12:13:26