Cuda 共享内存优化混乱

Cuda 共享内存优化混乱,cuda,memory-optimization,Cuda,Memory Optimization,我用cuda编写了一个应用程序,它在每个块中使用1kb的共享内存。 由于每个SM中只有16kb的共享内存,所以总体上只能容纳16个块(我理解正确吗?),虽然一次只能调度8个,但现在如果某个块忙于内存操作,那么其他块将在gpu上调度,但是所有共享内存都被其他16个已经在那里调度的块使用,因此cuda不会在同一个sm上调度更多的块,除非之前分配的块完全完成?或者,它会将某些块的共享内存移动到全局内存,并在那里分配其他块(在这种情况下,我们应该担心全局内存访问延迟吗?它不是这样工作的。计划在任何给定时

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

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

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

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

    这是否意味着有时不使用共享内存更好?因为更多的区块将并行运行?这真的取决于。共享内存的速度要慢得多,因为寄存器和寄存器之间没有库冲突,所以如果可能的话,最好使用寄存器而不是共享内存。共享内存的传统用途是允许块内线程之间的数据重用,而在费米时代之前,这是非常有效的。在费米中,共享内存的情况可能不那么引人注目。L1和L2缓存意味着您通常可以在不做任何事情的情况下达到共享内存薄荷产量的一小部分,并且不需要担心库冲突或序列化效果。因此,如果某个块在某一时刻被安排在一个SM上,而现在所有的扭曲都在等待内存操作完成,那么cuda会在同一个SM上调度其他块(已分配块的共享内存数据会发生什么情况?)还是等到分配的块完成其操作?硬件总是调度尽可能多的块来运行,然后再调度,直到资源可用,以便调度更多的块。如果SM上的每个活动扭曲都在等待内存事务或处于同步障碍,则SM将被暂停。调度启发法的具体工作方式尚未正式记录,但一致认为,在费米之前的卡中,在SM上完成每个块之前,不会调度新的块,但在费米上,它更灵活。