前言:假设我在 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 SM = 1,344 GB/s
上面的数字会影响 SM 的数量,即 15。因此,要达到这个最大共享内存带宽,我需要让所有15 个 SM 读取共享内存。
我的问题:为了达到最大全局内存带宽,只从全局内存中读取一个SM 就足够了,还是应该所有 SM 都尝试同时从全局内存中读取?更具体地说,假设我启动了一个带有 32 个线程的块的内核。那么,如果我在 SM-0 上有唯一的一个 warp,并且我在内核中所做的一切都是以合并的方式从全局内存中不间断地读取,我会达到 177.4 GB/s 吗?或者我应该启动至少 15 个块,每个块有 32 个线程,以便 SM-0 到 SM-14 上的 15 个扭曲尝试同时读取?
立即要做的事情可能是运行基准测试来解决这个问题。我想了解为什么会发生什么,会发生什么。