共享内存优化混淆

pee*_*ush 4 cuda memory-optimization

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

tal*_*ies 7

它不像那样工作.计划在单个SM上的任何给定时刻运行的块数始终是以下的最小值:

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

这就是它的全部.共享内存没有"分页"以容纳更多块.NVIDIA生成一个计算入住率的电子表格,随工具包提供,可单独下载.您可以在其包含的公式中查看确切的规则.它们也在CUDA编程指南的4.2节中讨论.