memory - 达到理论 GPU 全局内存带宽

标签 memory global gpu bandwidth max

序言: 假设我在 CUDA 中使用 NVIDIA GTX480 卡。该卡的理论峰值全局内存带宽为 177.4 GB/s: 384*2*1848/8 *1E9 = 177.4GB/秒

384 来自内存接口(interface)宽度,2 表示内存的 DDR 性质,1848 是内存时钟频率(以 MHz 为单位),8 来 self 想要以字节为单位得到答案的事实。

可以对共享内存进行类似的计算: 每个存储体 4 个字节 * 32 个存储体 * 每个周期 0.5 个存储体 * 1400MHz * 15 个 SM = 1,344 GB/s

上面的数字是 SM 数量的因素,即 15。因此,为了达到最大共享内存带宽,我需要所有 15 个 SM 读取共享内存。

我的问题: 为了达到最大全局内存带宽,仅一个 SM 从全局内存读取就足够了,还是所有 SM 都应该尝试同时从全局内存读取? 更具体地说,假设我启动了一个内核,其中一个 block 有 32 个线程。然后,如果我在 SM-0 上有唯一的扭曲,并且我在内核中所做的所有操作都是以合并的方式从全局内存中不间断读取,我会达到 177.4 GB/s 吗?或者我应该启动至少 15 个 block ,每个 block 有 32 个线程,以便 SM-0 到 SM-14 上的 15 个扭曲尝试同时读取?

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

最佳答案

据我所知,GPU 的片上网络是 TPC 和内存 Controller 的交叉开关。因此,理论上,一个 SM 可以在不同内存 Controller 之间交错内存访问,以实现完整的全局带宽。但请注意,每个交叉开关接口(interface)都有一个缓冲区,如果该缓冲区不够大,则事件 SM 中的内存指令可能会停止。此外,每个 SM 保持未完成的内存访问的能力有限。这些问题可能会限制每个 SM 可以利用的内存带宽。所以,我认为你的问题的答案需要一些microbenchmarking我猜想一个 SM 无法利用整个全局内存带宽。

关于memory - 达到理论 GPU 全局内存带宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12360861/

相关文章:

python - PyGTK 曲线内存错误

memory - Go 中的磁盘备份数组

php - 是否有比 file_get_contents 占用更少内存或更有效的合并 MP3 的方法?

delphi - 为什么我的全局变量在调试时是 "inaccessible"?

javascript - 在 res 范围之外的 node.js 中使用 i18n-2

c - 如何在 C 中定义全局常量 char 指针并在整个文件中重新定义指向值

google-cloud-platform - 在 Google Cloud VM 中将 GPU 与容器和容器优化操作系统一起使用

java - 将 Java 与 Nvidia GPU (CUDA) 结合使用

javascript - OSX 上的 Node 中的小程序内存不足?

python - 理解和优化 pyCUDA 中的线程、 block 和网格