达到理论 GPU 全局内存带宽

Posted

技术标签:

【中文标题】达到理论 GPU 全局内存带宽【英文标题】:reaching theoretical GPU global memory bandwidth 【发布时间】:2012-09-03 20:39:59 【问题描述】:

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

当务之急可能是运行基准测试来解决这个问题。我想了解为什么会发生什么。

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于达到理论 GPU 全局内存带宽的主要内容,如果未能解决你的问题,请参考以下文章

CUDA 学习(十七)优化策略2:内存因素

cuda GPU 编程之共享内存的使用

CUDA 学习(十三)全局内存

GPU存储器架构-- 全局内存 本地内存 寄存器堆 共享内存 常量内存 纹理内存

CUDA学习之使用共享内存(shared memory)进行归约求和

带有 OpenCL 的 Intel HD 6000 本地内存带宽 [关闭]