基本內容
SIMD:
(Single Instruction Multiple Data,單指令多數據流)能夠複製多個運算元,並把它們打包在大型暫存器的一組指令集,例:3DNow!、SSE。
以同步方式,在同一時間內執行同一條指令。
SIMD在性能上的優勢:
以加法指令為例,單指令單數據(SISD)的CPU對加法指令解碼後,執行部件先訪問記憶體,取得第一個運算元;之後再一次訪問記憶體,取得第二個運算元;隨後才能進行求和運算。而在SIMD型的CPU中,指令解碼後幾個執行部件同時訪問記憶體,一次性獲得所有運算元進行運算。這個特點使SIMD特別適合於多媒體套用等數據密集型運算。
如:AMD公司引以為豪的3D NOW! 技術實質就是SIMD,這使K6-2、雷鳥、毒龍處理器在音頻解碼、視頻回放、3D遊戲等套用中顯示出優異的性能。
在大型機上使用SIMD指令集
使用Z13矢量擴展工具中的SIMD指令集加速社交媒體和大數據工作負載處理。
IBM的z13處理器通過更大容量的快取,同時多執行緒,大頁面幀,指令流水線管理和單指令多數據,增加高性能大型機伺服器的計算能力。
Z13被設計成為大型機提供移動計算能力。並且處理器通過z13矢量擴展設備,回歸單指令多數據(SIMD)。
SIMD適量指令能夠加速如C和Java語言的處理。矢量指令對過個數據元素進行並行操作,從而使主機能夠快速處理大量數據。這對於社交媒體和大數據工作負載來說是個福音,但對面臨普通負載的系統程式設計師來說似乎沒有太大的幫助。
SIMD指令通過多種方式增加吞吐量。大多數機器指令會的結果會復蓋輸入運算元其中之一不同,大部分SIMD指令集會使用兩個輸入暫存器,並將結果存儲在第三個暫存器。這意味著程式設計師可以節省與暫存器糾結的時間。
矢量暫存器為128位元組長度。前16個暫存器實際上與64位浮點暫存器(FPRs)共存。改變一個FPR同樣會破壞對應矢量暫存器的所有位元組。存在一些關於通過程式調用保護矢量暫存器的特殊規則,IBM的Assembler Services Guide有詳細說明。
SIMD向量指令包括所有數學函式和浮點模式。同樣也有字元串操作以及用於獲取和存儲數據的方法。
矢量暫存器內容由1、2、4、8或16位元組元素組成。矢量指令掩膜指定需要被操縱原件的尺寸。所有矢量指令助記符從V開始,雖然IBM同樣還為特定的元素大小提供了額外的記憶空間,具體可以查閱z13 Principles of Operation手冊低21章24節。
SIMD指令如何工作
載入矢量暫存器的命令看起來很熟悉:
VL V1, D2(X2,B2)
其中V1是矢量暫存器,D2是位移,X2和B2為索引與基地址暫存器。
但是,由於矢量暫存器的內容有元素組成,還有指令可以與他們單獨打交道。例子之一就是Vector Load Element指令,可以更新一個元素:
VLEx V1,D2(X2,B2)M3
其中x指定元素的大小,B為位元組,H為半字(16位),F為全字以及G為雙字。V1、D2、 X2 與 B2運算元扮演熟悉的角色,但M3的掩膜指定欄位的索引並更新。因此VLEH V1,HALFWORD,3會更新矢量暫存器1的第四個半字,並保持其他元素不變。
在常規負載下,SIMD向量負載指令集有多種方法來產生掩膜,從通用暫存器插入元素並從一種矢量包裝元素到暫存器。這與十進制不大一樣——這種能力能減半元素並將其壓縮到另一個暫存器。
Vectorregisterexamples
假設我們已經載入了兩個矢量暫存器,每個暫存器有8個半字整數,我們可以將所有元素合在一起,用一條矢量添加指令:
VA V1,V2,V3,M4
本例中,處理器把V2和V3中的半字元素相加並保存在V1中,這樣體現了SIMD指令的非破壞自然屬性。掩膜值應該與半字相同。處理器會將溢出移動到整數符號位,這樣可以使計算有點棘手。
矢量指令同樣也支持字元串函式。只要掌握幾個複雜選項,SIMD字元串功能就能變得更簡單一些,你可以把他們作為硬體實現C語言字元串處理函式。讓我們以Vector Find Element Equal為例:
VFEE V1,V2,V3,M4[,M5]
在高級別上,該指令會比較V2與V3中的元素,並在V1設定相應的標識。掩膜M4表示元素的大小,M5指定兩件事:設定位2告訴處理器比較V2、V3和0。當位4等於1,處理器將會設定條件碼。在任何速率下,指令會從左往右比較第二個和第三個運算元元素。當它發現相等的元素,就會在第一個運算元的第七位元組設定元素位元組索引。如果沒有元素相等,第一個運算元的第七位元組將包含一個與暫存器元素數量相等的位元組索引。如果指令發現所有元素都為零,也會進行同樣的操作。