共享内存优化混淆

时间:2011-04-10 09:10:01

标签: cuda memory-optimization

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

1 个答案:

答案 0 :(得分:7)

它不起作用。计划在单个SM上的任何给定时刻运行的块数始终是以下最小值:

  1. 8个街区
  2. 静态和动态分配的共享内存总和小于16kb或48kb的块数,具体取决于GPU架构和设置。还有共享内存页面大小限制,这意味着每个块分配将四舍五入到页面大小的下一个最大倍数
  3. 每块寄存器使用总和小于8192/16384/32678的块数,具体取决于体系结构。还有寄存器文件页面大小,这意味着每个块分配被四舍五入到页面大小的下一个最大倍数。
  4. 这就是它的全部。共享内存没有“分页”以容纳更多块。 NVIDIA生成一个计算入住率的电子表格,随工具包提供,可单独下载。您可以在其包含的公式中查看确切的规则。它们也在CUDA编程指南的4.2节中讨论过。