Loading AI tools
来自维基百科,自由的百科全书
SSE4 (Streaming SIMD Extensions 4)是Intel Core微架構和AMD K10中所使用的SIMD CPU指令集。它在2006年9月27日在英特爾開發者論壇上被宣佈,白皮書上的細節還較為模糊。[1]隨後在北京的2007年春季英特爾開發者論壇上的演示文稿中提供了47個指令的更精確細節。[2]SSE4與為前代英特爾64和IA-32架構微處理器編寫的軟體完全相容。所有現有軟體均可正確運行,無需修改包含SSE4的微處理器,以及現有和新應用程式(包含SSE4)。[3]
英特爾SSE4包含54條指令。由Penryn提供的包含47條指令的子集,在英特爾文件中稱為SSE4.1。此外,SSE4.2是由剩餘7條指令組成的第二個子集,首次在基於Nehalem的Core i7中提供。英特爾將開發人員的回饋資訊稱為指令集開發中的重要角色。
從基於Barcelona的處理器開始,AMD推出了SSE4a指令集,其中有原有的4條SSE4指令和4條新的SSE指令。在支援SSE4.1的英特爾處理器中沒有發現這些指令並且AMD處理器僅在基於Bulldozer的 FX 處理器上開始支援英特爾的 SSE4.1和SSE4.2 (完整的 SSE4 指令集)。在使用SSE4a時,AMD還引入了未對齊的SSE特性,這意味著未對齊的載入指令在對齊的位址上與對齊版本一樣快。它還允許禁止訪問主記憶體的非載入SSE操作的對齊檢查。[4]英特爾後來在他們的Nehalem處理器中對未對齊的SSE進行了類似的速度改進,但是沒有在AVX之前引入非負載SSE指令的未對齊訪問。[5]
在Intel Core 2系列中引入的現在稱為SSSE3(補充串流SIMD擴展3)的部分在英特爾提出SSSE3名稱之前被媒體稱為SSE4。而在內部則把新的指令稱為Merom。 一些記者批評英特爾最初並沒有計畫給它們指定一個獨有的名稱。[6]英特爾最終清除了混淆,並保留了SSE4名稱以用於下一個指令集擴展。[7]
英特爾正在使用營銷術語HD Boost來指代SSE4。[8]
與之前SSE的所有迭代不同,SSE4包含執行不特定於多媒體應用的操作的指令。它具有許多指令,其操作由一個常數欄位和一組將XMM0作為隱式第三操作數的指令決定。
enryn公司的單週期shuffle引擎啟用了其中的幾條指令。(隨機操作重新排序暫存器中的位元組被稱爲shuffle。)
指令 | 描述 |
---|---|
MPSADBW | 計算絕對差的八個偏移和,每次四個(即:|x0−y0|+|x1−y1|+|x2−y2|+|x3−y3|, |x0−y1|+|x1−y2|+|x2−y3|+|x3−y4|, …, |x0−y7|+|x1−y8|+|x2−y9|+|x3−y10|)。這個操作對一些HD 編解碼器來說很重要。並且允許在少於七個週期內計算8×8塊的差異。[9]三位直接運算元的一個位指示是否應從目標運算元中使用y0 .. y10或 y4 .. y14, 另外兩種方法是否應從源中使用x0..x3, x4..x7, x8..x11或x12..x15。 |
PHMINPOSUW | 將目標的底部無符號16位元字設定為源中最小的無符號16位元字,將底部的下一個字設定為源中該字的索引。 |
PMULDQ | 在兩組四個壓縮整數中的兩組中進行壓縮有符號乘法,第一個和第三個壓縮4,給出兩個打包的64位元結果。 |
PMULLD | 打包有符號乘法,四個打包的32位元整數組相乘,得到4個打包的32位元結果。 |
DPPS;DPPD | AOS(結構數組)數據的點積。這需要一個立即操作數,它由四個(或兩個DPPD)位組成,用於選擇輸入中的哪個條目進行乘法和累加,另外四個(或兩個DPPD)選擇是將0還是點積輸出的相應欄位。 |
BLENDPS;BLENDPD;
BLENDVPS;BLENDVPD; PBLENDVB;PBLENDW |
基於(對於非V形式)立即操作數中的位以及(對於V形式)暫存器XMM0中的位的條件複製一個位置中的元素與另一個位置中的元素。 |
PMINSB;PMAXSB;
PMINUW;PMAXUW; PMINUD;PMAXUD; PMINSD;PMAXSD |
不同整型操作數類型的最小/最大值壓縮。 |
ROUNDPS;ROUNDSS;
ROUNDPD;ROUNDSD |
使用立即數操作數指定的四種捨入模式中的一種將浮點暫存器中的值整數到整數。 |
INSERTPS;PINSRB;
PINSRD / PINSRQ; EXTRACTPS;PEXTRB; PEXTRD / PEXTRQ |
NSERTPS和PINSR指令從x86暫存器或儲存器位置讀取8,16或32位元,並將其插入由立即數操作數給定的目標暫存器中的欄位。EXTRACTPS和PEXTR從源暫存器中讀取一個欄位,並將其插入x86暫存器或記憶體位置。例如,PEXTRD eax,[xmm0],1; EXTRACTPS [addr + 4 * eax],xmm1,1將xmm1的第一個欄位儲存在由xmm0的第一個欄位給出的位址中。 |
PMOVSXBW;PMOVZXBW;
PMOVSXBD;PMOVZXBD; PMOVSXBQ;PMOVZXBQ; PMOVSXWD;PMOVZXWD; PMOVSXWQ ;PMOVZXWQ; PMOVSXDQ;PMOVZXDQ |
打包標誌/零擴展到更廣泛的類型。 |
PTEST | 這與TEST指令相似,因為它將Z標誌設定為其操作數之間的AND結果:如果DEST AND SRC等於0,則設定ZF。另外,如果(NOT DEST)AND SRC等於零。
這相當於如果沒有設定SRC掩碼的位,則設定Z標誌,如果設定了SRC掩碼的所有位,則設定C標誌。 |
PCMPEQQ | 四位元組(64位元)相等比較。 |
PACKUSDW | 將帶符號的DWORD轉換為飽和的無符號WORD。 |
MOVNTDQA | 從寫入組合儲存區有效讀取到SSE暫存器; 這對於從連接到儲存器總線的外設檢索結果很有用。 |
SSE4.2添加了STTNI(字串和文字新指令)[10],和每次對16個位元組的兩個操作數執行字元搜尋和比較的幾個新指令。這些設計(除其他外)旨在加快解析XML文件。[11]這也增加了一個CRC32指令來計算循環冗餘校驗,比如可以在某些數據傳輸協定使用。這些指令首先在基於Nehalem的Intel Core i7產品系列中實現,並完成SSE4指令集。支援通過CPUID.01H:ECX.SSE42 [bit20]標誌指示。
指令 | 描述 |
---|---|
CRC32 | 使用多項式0x11EDC6F41(或沒有高位,0x1EDC6F41)累加CRC32C值。 |
PCMPESTRI | 打包比較顯式長度字串,返回索引。 |
PCMPESTRM | 打包比較顯式長度字串,返回掩碼。 |
PCMPISTRI | 打包比較隱式長度字串,返回索引。 |
PCMPISTRM | 打包比較隱式長度字串,返回掩碼。 |
PCMPGTQ | 比較已打包簽名的64位元數據。For Greater Than |
這些指令在整數而不是SSE暫存器上運行,因為它們不是SIMD指令,而是同時出現的指令。雖然它們是由AMD通過SSE4a指令集引入的,但卻往往被視為單獨的擴展,並且帶有自己的專用CPUID位以指示對其的支援。Intel以Nehalem微體系架構和LZCNT開始,實現了從Haswell微架構開始的POPCNT 。AMD從Barcelona微體系架構開始實施。
AMD稱這一對高級位元運算Advanced Bit Manipulation (ABM)指令。
指令 | 描述 |
---|---|
POPCNT | 漢明權重(計數位數設定為1)。支援通過CPUID.01H:ECX.POPCNT [位23]標誌指示。 |
LZCNT | Find First Set。支援通過CPUID.80000001H:ECX.ABM [位5]標誌指示。 |
除非輸入為0,否則lzcnt的結果等於bsr(位掃描反轉)。lzcnt產生32的結果,而bsr產生未定義的結果(並設定零標誌)。lzcnt的編碼與bsr的編碼相似,如果lzcnt在不支援它的CPU上執行,比如Haswell之前的Intel CPU,它將執行bsr操作,而不是產生無效的指令錯誤。
Trailing zeros可以使用現有的bsf指令進行計數。
AMD公司的Barcelona微體系架構中引入了SSE4a指令組。這些說明在英特爾處理器中不可用。支援通過CPUID.80000001H:ECX.SSE4A [Bit 6]標誌指示。
指令 | 描述 |
---|---|
EXTRQ / INSERTQ | 組合掩碼移位指令。 |
MOVNTSD / MOVNTSS | 標量流儲存指令。 |
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.