處理器的大腦!小編帶您讀懂CPU指令集
泡泡網CPU頻道4月26日 在我們對一款CPU進行全面的了解的時候,我們看看大多數人都遺漏了什么。很多人一般先從處理器的架構開始,看看該處理器采用了什么架構,相比上一代或者競爭對手的CPU在架構上都有什么改進或者優勢。
其次,再看這款CPU與同檔次的處理器的主頻孰高孰低,默認高主頻的處理器一般是采用較好的晶圓來制造的,穩定性更好,再次是看該處理器的緩存容量有多少(尤其是Intel的處理器非常依賴緩存),緩存充當處理器與緩存之間的橋梁,起到一定的數據緩沖作用。
全面了解處理器
最后我們要看該處理器采用的制程,一般制程越先進,發熱量越低,而相對越好超,而比較關注節能性能的網友,還會著重看該處理器的功耗為多少。那么我們看完這些參數是不是漏了些什么呢?
其實仔細想想,我們會恍然大悟,還有該處理器支持的指令集。處理器單靠里面的硬件電路是不會計算的,必須依靠指令來計算和控制系統。
● CPU指令集至關重要
每款CPU設計的時候就制定了一套與內部電路配合的指令系統,從具體運用看,我們可以在很多CPU身上看到的就有MMX(Multi Media Extended)、SSE(Streaming SIMD Extensions)、SSE2、SSE3、SSSE3、SSE4(分為SSE4.1與SSE4.2兩代,AMD的SSE4A包含在SSE4里面,這個后面會提到),另外還有AMD的3D NOW!系列。
這些指令集可謂大大增強了CPU的多媒體、圖形圖象和Internet等的處理能力,下面就讓我們逐個了解下。
● MMX增強多媒體表現
MMX(Multi Media eXtension,多媒體擴展指令集)指令集是英特爾于1996年推出,主要用于多媒體指令增強。
支持MMX指令集的奔騰處理器
MMX指令集中包括有57條多媒體指令,通過這些指令可以一次處理多個數據,在處理結果超過實際處理能力的時候也能進行正常處理。MMX的益處在于,當時存在的操作系統不必為此而做出任何修改便可以輕松地執行MMX程序。
支持MMX的處理器擁有8個MMX寄存器,每個有64-bit(8byte)的容量。MMX僅支持整數操作,支持1/2/4/8-bytes數據。那即是說,一個MMX寄存器能夠儲存8/4/2/1個操作。這造成了MMX指令集與x87浮點運算指令不能夠同時執行,必須做密集式的交錯切換才可以正常執行,這種情況就勢必造成整個系統運行質量的下降。目前AMD和和英特爾處理器都支持這一指令集。
● 3D NOW!加速三維渲染
3DNow!指令集是由AMD提出的,廣泛應用于其K6-2 、K6-3以及Athlon(K7)處理器上。3DNow!跟后面提到的SSE非常類似,但也有一些不同。它擁有 8個新的寄存器,卻是64-bit的,并非128-bit。這樣,它只能存儲兩個浮點數據,而非四個。
K6處理器開始具有3D NOW!指令集
3DNow!可以執行操作:相加/相乘 /相除運算,精確或者近似平分根。3DNow!指令集技術其實就是21條機器碼的擴展指令集。3DNow!指令集主要針對三維建模、坐標變換 和效果渲染等三維應用場合,在軟件的配合下,可以大幅度提高3D處理性能。后來在Athlon上開發了Enhanced 3DNow!。
● SSE加快處理多媒體應用
SSE全拼是Streaming SIMD Extension,中文名稱為SIMD擴展流。SIMD英文全稱為 Single Istruction Multiple Data(單指令多數據),即一條指令可以完成多個操作。SSE是為提供處理器浮點性能而開發的擴展指令集。
SSE指令集包括了70條指令,其中包含單指令多數據浮點計算、以及額外的SIMD整數和高速緩存控制指令。其優勢包括:更高分辨率的圖像瀏覽和處理、高質量音頻、MPEG2視頻、同時MPEG2加解密;語音識別占用更少CPU資源;更高精度和更快響應速度。
SSE與MMX指令集
SSE指令與3DNow!指令彼此互不兼容,但SSE包含了3DNow!技術的絕大部分功能,只是實現的方法不同。SSE兼容MMX指令,它可以通過SIMD和單時鐘周期并行處理多個浮點數據來有效地提高浮點運算速度。
SSE(Streaming SIMD Extensions)是英特爾在AMD的3D Now!發布一年之后,在其計算機芯片Pentium III中引入的指令集,是MMX的超集。AMD后來在Athlon XP中加入了對這個指令集的支持。這個指令集增加了對8個128位寄存器XMM0-XMM7的支持,每個寄存器可以存儲4個單精度浮點數。使用這些寄存器的程序必須使用FXSAVE和FXRSTR指令來保持和恢復狀態。但是在Pentium III對SSE的實現中,浮點數寄存器又一次被新的指令集占用了,但是這一次切換運算模式不是必要的了,只是SSE和浮點數指令不能同時進入CPU的處理線而已。
● SSE2 更精確處理浮點數
SSE2是英特爾為了應對AMD的3Dnow!+指令集,在SSE的基礎上開發了SSE2,增加了一些指令,使得其處理器性能有大幅度提高。
SSE2最早在奔4引入
最早在Pentium 4處理器的最初版本中引入,AMD后來在Opteron 和Athlon 64處理器中也加入了SSE2的支持。到P4設計結束為止,Intel增加了一套包括144條新建指令的SSE2指令集。SSE2涉及了多重的數據目標上立刻執行一單個的指令(即SIMD)。最重要的是SSE2能處理128位和兩倍精密浮點數學運算。
處理更精確浮點數的能力使SSE2成為加速多媒體程序、3D處理工程以及工作站類型任務的基礎配置。
SSE2指令集添加了對64位雙精度浮點數的支持,以及對整型數據的支持,也就是說這個指令集中所有的MMX指令都是多余的了,同時也避免了占用浮點數寄存器。這個指令集還增加了對CPU快取的控制指令。AMD對它的擴展增加了8個XMM寄存器,但是需要切換到64位模式(AMD64)才可以使用這些寄存器。Intel后來在其EM64T架構中也增加了對AMD64的支持。
● SSE3促進五個應用
SSE3指令集是規模最小的指令集,此前MMX包含有57條命令,SSE包含有50條命令,SSE2包含有144條命令,SSE3包含有13條命令。此外Intel害針對SSE3指令集作了一次額外擴充,那就是SSSE3是,最早內建于Core 2 Duo處理器中。
Intel Core 2 Duo處理器
SSE3指令集共分為5個應用層: 第一層是“數據傳輸”,只有一條指令:FISTTP,它有利于x87浮點轉換成整數,并可以大大提高優化的效率。 第二層是“數據處理”,指令共有五條,分別是ADDSUBPS,ADDSUBPD,MOVSHDUP,MOVSLDUP,MOVDDUP。這些指令可以簡化復雜數據的處理過程,由于未來數據處理流量將會越來越大,因此Intel在這里應用的指令集最多、達到了五條。 第三層是“特殊處理”,也只有一條:LDDQU。在這條指令主要針對視頻解碼,用來提高處理器對處理媒體數據結果的精確性。 第四層是“優化”,共有四條指令,分別是HADDPS,HSUBPS,HADDPD,HSUBPD,它們可以對程序起到自動優化的作用,對處理3D圖形相當有用。 第五層是“超線程性能增強”,共有兩條針對線程處理的指令:MONITOR, MWAIT,這有助于增加Intel超線程的處理能力、大大簡化了超線程的數據處理過程。
● SSE4.1改進視頻處理
SSE4.1是Intel在Penryn核心的Core 2 Duo與Core 2 Solo處理器時,新增的47條新多媒體指令集,用來加強視頻編輯等方面的應用。另外,AMD也開發了屬于自己的SSE4a多媒體指令集,并內建在Phenom與Opteron等K10架構處理器中,不過相關應用都差不多,并且無法與Intel的SSE4系列指令集相容。
緩慢的視頻處理
據了解,在進行視頻編碼時需要進行動態預測(Motion Estimation)及差分編碼方式去除相鄰2張影像之相關性,這是一個非常復雜的運算動作。在沒有SSE4指令集時,完成一個步驟需要以下指令語句:
for (int moveblock=0;moveblock<16;moveblock++)
for(int line=0; line<16; line++) // Does the 16 pixels large in 4 iteration
{
int i=0;
sum0+=abs( pBlock1[j]-pBlock2)+abs(pBlock1[j+1]-pBlock2[i+1])+abs(pBlock1[j+2]-pBlock2[i+2])+abs(pBlock1[j+3]-pBlock2[i+3]); // Compare with 0 pixel offset
sum1+=abs(pBlock1[j+1]-pBlock2)+abs(pBlock1[j+2]-pBlock2[i+1])+abs(pBlock1[j+3]-pBlock2[i+2])+abs(pBlock1[j+4]-pBlock2[i+3]); // Compare with 1 pixel offset
sum2+=abs(pBlock1[j+2]-pBlock2)+abs(pBlock1[j+3]-pBlock2[i+1])+abs(pBlock1[j+4]-pBlock2[i+2])+abs(pBlock1[j+5]-pBlock2[i+3]); // Compare with 2 pixel offset
sum3+=abs(pBlock1[j+3]-pBlock2)+abs(pBlock1[j+4]-pBlock2[i+1])+abs(pBlock1[j+5]-pBlock2[i+2])+abs(pBlock1[j+6]-pBlock2[i+3]); // Compare with 3 pixel offset
sum4+=abs(pBlock1[j+4]-pBlock2)+abs(pBlock1[j+5]-pBlock2[i+1])+abs(pBlock1[j+6]-pBlock2[i+2])+abs(pBlock1[j+7]-pBlock2[i+3]); // Compare with 4 pixel offset
sum5+=abs(pBlock1[j+5]-pBlock2)+abs(pBlock1[j+6]-pBlock2[i+1])+abs(pBlock1[j+7]-pBlock2[i+2])+abs(pBlock1[j+8]-pBlock2[i+3]); // Compare with 5 pixel offset
sum6+=abs(pBlock1[j+6]-pBlock2)+abs(pBlock1[j+7]-pBlock2[i+1])+abs(pBlock1[j+8]-pBlock2[i+2])+abs(pBlock1[j+9]-pBlock2[i+3]); // Compare with 6 pixel offset
sum7+=abs(pBlock1[j+7]-pBlock2)+abs(pBlock1[j+8]-pBlock2[i+1])+abs(pBlock1[j+9]-pBlock2[i+2])+abs(pBlock1[j+10]-pBlock2[i+3]); // Compare with 7 pixel offset
i=4;
j=moveblock+4;
…
… }
}
一大串的指令極度浪費處理器資源,而在支持SSE4指令集的處理器上,只需要采用4 SAD運算指令:
MPSADBW xmm0,xmm1,0
便完全代替了以上繁復的指令串,大幅提升動態預測(Motion Estimation)及差分編碼的運算速度。
● SSE4.2優化文本處理
SSE4.2指令集相比SSE4.1新增了STTNI(STring & Text New Instructions)和ATA(Application Targeted Accelerators)兩個部分。此次的改進不是針對多媒體而是加速對XML文本的字符串操作、存儲校驗等。
漂亮的藝術字
SSE4.2加入了七個新指令:CRC32、PCMPESTRI、PCMPESTRM、PCMPISTRI、PCMPISTRM、PCMPGTQ 與 POPCNT這樣一來,采用SSE4.2指令集的處理器,XML的解析速度最高是原來的3.8倍,而指令周期節省可以達到2.7倍。
在ATA領域,SSE 4.2指令集對于大規模數據集中處理和提高通信效率也都會發揮應有的作用,這些對于企業IT應用是有幫助大有裨益的。
● SSE5融匯多條指令
長久以來,Intel一直在處理器指令集方面具有霸主地位,而SSE5得出現就是AMD試圖改變這一切。SSE5初期規劃將加入超過100條新指令,其中最引人注目的就是三算子指令(3-Operand Instructions)及熔合乘法累積(Fused Multiply Accumulate)。
三算子指令讓處理器可將一個數學或邏輯函式庫,套用到算子或輸入資料。借由增加算子的數量,一個 x86 指令能處理二至三筆資料, SSE5允許將多個簡單指令匯整成一個指令,達到更有效率的指令處理模式。提升為三運算指令的運算能力,是少數 RISC 架構的水平。
AMD對“推土機”處理器抱厚望
熔合乘法累積讓允許建立新的指令,有效率地執行各種復雜的運算。熔合乘法累積可結合乘法與加法運算,透過單一指令執行多筆重復計算。透過簡化程式碼,讓系統能迅速執行繪圖著色、快速相片著色、音場音效,以及復雜向量演算等效能密集的應用作業。SSE5將很可能內建于AMD下一代Bulldozer(推土機)核心。
除了以上幾個常見到的指令集,還有兩個“非主流”指令集:AVX與FMA。
AVX是Intel的SSE延伸架構,如IA16至IA32般的把暫存器XMM 128bit提升至YMM 256bit,以增加一倍的運算效率。此架構支持了三運算指令(3-Operand Instructions),減少在編碼上需要先復制才能運算的動作。在微碼部分使用了LES LDS這兩少用的指令作為延伸指令Prefix。
FMA是Intel的AVX擴充指令集,是Fused Multiply Accumulate的簡寫,翻譯過來就是熔合乘法累積。
Intel Core i3-540
Intel Core i3-540默認主頻高達3.06GHz,基于雙核心四線程設計,采用最新32nm設計。功耗僅73W,并集成733MHz的顯示核心。支持MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, EM64T指令集。
● 總結
現在我們算是對CPU中的指令集有了一番了解,在我們日后挑選處理器時,可不要忘了這個重要的參數。■<
關注我們



