架構細節
SIMT架構?
您可能已經熟悉SIMD和MIMD這些名詞,但在推出GT200時,Nvidia將他們的著色引擎多重處理器稱為「SIMT單元」。這又是什麼?SIMT的原文為單一指令多重執行緒(Single Instruction Multiple Threads),它與SIMD模式的主要差別是它處理的向量大小沒有預先定義的大小。具體說來,擁有足夠的執行緒數目時,這種處理器的運作就像純量處理器。要了解其間的差異,請先回想以往架構中像素著色引擎單元的運作方式。
Rasterizer產生 quads–也就是2x2像素的正方形,每個像素由1個含有4個單精度浮點值(R,G, B, A)或(X, Y, Z, W)的向量組成,這兩種是3D運算中最常用的格式。接著將這些quad移入以16路SIMD模式運作的ALU,將相同的指令分別套用到全部16個浮點數。這樣簡化是為了說明其運作原理,實際上GeForce 6和7有一個稱為co-issue的模式,用以對每個向量執行兩個指令。
從G80開始,這個運算模式經過大幅修改。Rasterizer仍然會產生quad,但將它放在緩衝區中。緩衝區中有8個quad(32個像素,在CUDA術語中稱為warp),可供在SIMD模式下運作的多重處理器加以執行。那麼這兩種方式有什麼差別?差別在於資料的排列方式:多重處理器處理的不是像這樣排列的4個浮點數的4個向量:(R, G, B, A, R, G, B, A, R, G, B, A, R, G, B, A),而是處理32個浮點數的向量,每個向量由32個執行緒的單一分量構成,像這樣:
(R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R) 接著是 (G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G, G) …等。
在SIMD程式設計中,第一種資料對齊方式稱為AoS(結構陣列),第二種方式是SoA(陣列結構)。第二種排列方式的效能較佳。如果資料量足以填滿一個向量,那麼從程式設計者的觀點看來,處理器的運作方式就和純量處理器相同,因為不論要處理的資料大小如何,SIMD單元的使用率永遠是100%。相反地,AoS必須將相同的指令套用在每個向量的全部4個分量,才可達到最高效能。