达到GPU理论全局内存带宽

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个SMs= 1,344 GB/s

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

我的问题: 为了达到最大全局内存带宽,只需要一个SM从全局内存中读取吗?还是所有的SM都应该同时尝试从全局内存中读取? 更具体地说,假设我启动了一个具有32个线程的块的核函数。然后,如果我只有SM-0上的一个唯一的warp,并且在核函数中我不停地以合并的方式从全局内存中读取,那么我会达到177.4 GB/s吗?还是应该启动至少15个块,每个块都有32个线程,以使SM-0到SM-14上的15个warp同时尝试读取?

立即要做的事情可能是运行基准测试来弄清楚这一点。但是我希望了解为什么会发生这种情况。

1个回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接