SIMD

SIMD

SIMD全稱Single Instruction Multiple Data,單指令多數據流,能夠複製多個操作數,並把它們打包在大型寄存器的一組指令集

概念


以同步方式,在同一時間內執行同一條指令。

性能上優勢


以加法指令為例,單指令單數據(SISD)的CPU對加法指令解碼后,執行部件先訪問內存,取得第一個操作數;之後再一次訪問內存,取得第二個操作數;隨後才能進行求和運算。而在SIMD型的CPU中,指令解碼後幾個執行部件同時訪問內存,一次性獲得所有操作數進行運算。這個特點使SIMD特別適合於多媒體應用等數據密集型運算。
如:AMD公司引以為豪的3D NOW! 技術實質就是SIMD,這使K6-2、雷鳥、毒龍處理器在音頻解碼、視頻回放、3D遊戲等應用中顯示出優異的性能。

指令集


使用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向量負載指令集有多種方法來產生掩膜,從通用寄存器插入元素並從一種矢量包裝元素到寄存器。這與十進位不大一樣——這種能力能減半元素並將其壓縮到另一個寄存器。
Vector register examples
假設我們已經載入了兩個矢量寄存器,每個寄存器有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,處理器將會設置條件碼。在任何速率下,指令會從左往右比較第二個和第三個操作數元素。當它發現相等的元素,就會在第一個操作數的第七位元組設置元素位元組索引。如果沒有元素相等,第一個操作數的第七位元組將包含一個與寄存器元素數量相等的位元組索引。如果指令發現所有元素都為零,也會進行同樣的操作。