AMD的Cypress核心内部的流处理器是按照SIMD(单指令多数据流)划分的,每组SIMD阵列内部包括了80个流处理器,这些流处理器拥有独立的纹理单元和一级缓存(L1)以及本地数据共享缓存(Local Data Share)。
为了满足DX11中DirectCompute 11的要求,AMD增加了本地数据共享缓存的大小(Local Data Share,LDS),容量达到了32KB,是RV770的两倍。LDS用于同一个线程组(Thread Group)中的线程共享数据。从上图中我们可以看到,每一个SIMD连接一个LDS,不同的SIMD是不能共享LDS的,因此所有属于同一个线程组的线程都会被线程调度器发送到同一个SIMD上执行。
如果不同的SIMD上的线程要共享数据,需要用到全局数据共享缓存(Global Data Share,GDS)。在Cypress中,GDS的容量也倍增了,达到64KB。到目前为止,我们对GDS的了解仍然有限,与LDS不同,并没有指令能显式的操作GDS。据Beyond3D的消息,在未来的OpenCL扩展中可能会提供对GDS的访问,目前GDS只对编译器可见。
★ GF100的一级缓存:可动态分配容量的多功能智能缓存
以往的GPU都是没有一级缓存的,只有一级纹理缓存,因为这些缓存无法在通用计算中用于存储计算数据,只能用于在纹理采样时暂存纹理。而在GF100当中,NVIDIA首次引入真正的一级高速缓存,而且还可被动态的划分为共享缓存。
31
在GF100 GPU中,每个SM除了拥有专用的纹理缓存外,还拥有64KB容量的片上缓存,这部分缓存可配置为16KB的一级缓存+48KB共享缓存,或者是48KB一级缓存+16KB共享缓存。这种划分方式完全是动态执行的,一个时钟周期之后可自动根据任务需要即时切换而不需要程序主动干预。
一级缓存与共享缓存是互补的,共享缓存能够为明确界定存取数据的算法提升存取速度,而一级缓存则能够为一些不规则的算法提升存储器存取速度。在这些不规则算法中,事先并不知道数据地址。
对于图形渲染来说,重复或者固定的数据比较多,因此一般是划分48KB为共享缓存,当然剩下的16KB一级缓存也不是完全没用,它可以充当寄存器溢出的缓冲区,让寄存器能够实现不俗的性能提升。
而在并行计算之中,一级缓存与共享缓存同样重要,它们可以让同一个线程块中的线程能够互相协作,从而促进了片上数据广泛的重复利用并减少了片外的通信量。共享存储器是使许多高性能CUDA应用程序成为可能的重要促成因素。
★ 可动态分配的共享式一级缓存大幅提升并行计算效率
再来算算一级缓存的总容量,Cypress拥有8KBx20=160KB的一级缓存,和32KBx20=640KB的本地数据共享缓存,还有额外的64KB全局数据共享缓存。
而GF100拥有64KBx16=1MB容量的一级缓存+共享缓存,他们可以被动态的划分为256KB一级缓存+768KB共享缓存,或者768KB一级缓存+256KB共享缓存,另外还有12KBx16=192KB的纹理缓存,无论从哪个方面来比较,都要比Cypress强很多。
32
此次NVIDIA创新性的可动态划分一级缓存设计,是以往CPU上面都不曾有过的先进技术,大幅提升了GPU并行计算的数据处理能力,使得GPU庞大的流处理器资源在高负荷密集型运算时不至于出现瓶颈,从而发挥出恐怖的浮点运算能力。
再来看看GPU二级缓存部分的设计,这一方面就与CPU非常相似了。 ★ Cypress的二级缓存:绑定显存控制器的分离式设计
以往的GPU,包括NVIDIA上代的GT200以及AMD最新的Cypress核心,二级缓存都是与显存控制器绑定在一起的,其作用就是缩短GPU到显存的响应时间。由于显存控制器一般都是64bit(网购最低价 232元)一组,为多组模块化设计,因此二级缓存也被划分为N个独立的模块,而不是统一的整体。
33
Cypress:L2绑定Memory Controller
Cypress拥有4个64bit显存控制器,每个显存控制器绑定128KB容量的二级缓存,总计512KB,这个容量要比NVIDIA上代的GT200大一倍。
★ GF100的二级缓存:统一的大容量高速缓存
而GF100拥有一个768KB容量统一的二级高速缓存,该缓存可以为所有载入、存储以及纹理请求提供服务。二级缓存可在整个GPU中提供高效、高速的数据共享。物理效果、光线追踪以及稀疏数据结构等事先不知道数据地址的算法在硬件高速缓存上的运行优势尤为明显。后期处理过滤器需要多个SM才能读取相同的数据,该过滤器与存储器之间的距离更短,从而提升了带宽效率。
34
统一的共享式缓存比单独的缓存效率更高。在独享式缓存设计中,即使同一个缓存被多个指令预订,它也无法使用其它缓存中未贴图的部分。高速缓存的利用率将远低于它的理论带宽。GF100的统一共享式二级高速缓存可在不同请求之间动态地平衡负载,从而充分地利用缓存。二级高速缓存取代了之前GPU中的二级纹理缓存、ROP缓存以及片上FIFO。
35