What is Fermi?(10)
64KB可配置共享存储器
在第一代CUDA架构当中,为了提升应用程序的执行效率,NVIDIA首次加入了共享存储器这一概念,并且也确实取得了不错的效果。共享存储器设计在每个SM阵列当中,与各个流处理器直接相连,大大的提升了数据的摄取准确度。
NVIDIA在发现到共享存储器的重要性后,在此次的GF100产品当中,为每组SM专门配备了64KB的共享存储器与L1缓存来共用。
在每组SM阵列当中,均设计了容量为64KB的片上存储器,64KB的总容量实际上由16KB和48KB组合而 成。分为两种模式:16KB的L1缓存和48KB的共享缓存;或者是16KB的共享缓存和48KB的L1缓存。
通过两种不同形式的组合,L1缓存能够更好的与高速共享缓存起到互补作用。两者的区别主要在于:共享缓存能够为明确界定存储器存取的算法提升存储器存取速度;而L1缓存则能够为剩下那些不规则的算法提升存储器存取速度,并且在这些不规则算法中,事先并不知道数据地址。
在进行图形处理时,每个SM阵列当中可以使用到16KB的L1缓存,L1缓存作为寄存器溢出的缓冲区起到了更好的提升效能的作用。而到了并行计算当中,L1缓存和共享存储器可以协同工作,允许一个线程块中的线程互相协作,以减少片外的数据通信,大幅提升CUDA程序的执行效率。通过不同的需求,对64KB存储器进行合理分配,以达到更好的效能。
全局共享二级高速缓存
除了一级缓存外,在四个GPC当中,NVIDIA还为GF100设计了一个容量达到768KB的L2 Cache(二级缓存)。L2缓存主要为那些需要载入、存储以及纹理请求的设备提供服务,并且L2当中的数据可以为整个GPU提供数据共享,大大提升了各个GPC、SM之间的数据通讯能力。
在GF100当中的L2缓存被设计为可读、写操作,相对于GT200架构当中的只读L2缓存,具有更高的灵活性。NVIDIA表示,他们采用了一种优先算法来清除L2缓存中的数据,这种算法包含了各种检查,可帮助确保所需的数据能够驻留在高速缓存当中。
举例来说,对于运算物理效果、光线追踪、系数数据结构等一些不确定数据地址的情况,L2缓存能够提供更加快速的效率。而对于一些需要多个SM阵列读取相同数据的情况(如后期处理过滤器等),L2缓存同样是一种更好的解 决方案。
另外,L2缓存还能够起到平衡各个SM阵列当中高速缓存平衡的作用。例如,在某组SM阵列当中,高速缓存被执行程序超额预订后,程序无法跨越SM阵列进行存储,而另外一组SM阵列当中的高速缓存虽然并未完全占用,但是还会出现闲置情况。此时,L2缓存就能够让超额预定的高速缓存溢出部分转存到另外一组有剩余空间的高速缓存当中,以起到更加充分利用高速缓存的作用。
在GF100当中,L2缓存取代了之前NVIDIA GPU当中的L2纹理缓存、ROP缓存以及片上FIFO。
另外,L2缓存当中设计的保存储器按照程序的顺序执行存取指令,也为NVIDIA CUDA支持C/C++语言提供了坚实基础。当读、写路径分离(例如一个只读纹理路径以及一个只写ROP路径)时,可能会出现先写后读的危险。一个统一的读/写路径能够确保程序的正确运行。