6

前言:假设我在 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 个扭曲尝试同时读取?

立即要做的事情可能是运行基准测试来解决这个问题。我想了解为什么会发生什么,会发生什么。

4

1 回答 1

2

据我所知,GPU 的片上网络是 TPC 和内存控制器的交叉开关。因此,理论上一个 SM 可以在不同的内存控制器之间交错内存访问,以实现全全局带宽。但请注意,每个交叉开关接口都有一个缓冲区,如果这个缓冲区不够大,活动 SM 中的内存指令可能会停止。此外,每个 SM 都具有有限的容量来保持出色的内存访问。这些问题可能会限制每个 SM 可以使用的内存带宽。所以,我认为你的问题的答案需要一些微基准测试,我猜一个 SM 不能利用整个全局内存带宽。

于 2012-09-11T06:47:03.410 回答