达到理论GPU全局内存带宽

use*_*099 5 memory gpu global bandwidth max

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

384来自内存接口宽度,2来自内存的DDR特性,1848是内存时钟频率(以MHz为单位),8来自我希望在Bytes中获得答案的事实.

可以为共享存储器计算类似的东西:每个存储体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同时尝试读取?

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

las*_*gar 2

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