從CPU架構和技術的演變看GPU未來發展
GPU內部擁有很多種類型的緩存,不同的緩存都有各自特殊的用途,往往無法互相兼容,這完全不同與CPU內部L1、L2、L3這樣簡單的層級關系。
★ Cypress的一級緩存:固定功能、固定容量的專用緩存
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首次引入真正的一級高速緩存,而且還可被動態的劃分為共享緩存。
在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強很多。
此次NVIDIA創新性的可動態劃分一級緩存設計,是以往CPU上面都不曾有過的先進技術,大幅提升了GPU并行計算的數據處理能力,使得GPU龐大的流處理器資源在高負荷密集型運算時不至于出現瓶頸,從而發揮出恐怖的浮點運算能力。
關注我們


