前言: 假设我在CUDA中使用NVIDIA GTX480卡。这张卡片的理论峰值全局内存带宽为177.4 GB/s: 384*2*1848/8 *1E9 = 177.4 GB/s
384来自于内存接口宽度,2代表内存的DDR性质,1848是内存时钟频率(以MHz为单位),8来自于我想得到字节的事实。
类似的计算可以用于共享内存: 4个字节每个存储块* 32个存储块* 0.5个存储块每个周期* 1400MHz* 15个SMs= 1,344 GB/s
上面的数字考虑了SMs的数量,即15。因此,要达到最大的共享内存带宽,我需要有所有的15个SMs读取共享内存。
我的问题: 为了达到最大全局内存带宽,只需要一个SM从全局内存中读取吗?还是所有的SM都应该同时尝试从全局内存中读取? 更具体地说,假设我启动了一个具有32个线程的块的核函数。然后,如果我只有SM-0上的一个唯一的warp,并且在核函数中我不停地以合并的方式从全局内存中读取,那么我会达到177.4 GB/s吗?还是应该启动至少15个块,每个块都有32个线程,以使SM-0到SM-14上的15个warp同时尝试读取?
立即要做的事情可能是运行基准测试来弄清楚这一点。但是我希望了解为什么会发生这种情况。