|
在我們對一款CPU進行全面的了解的時候,我們看看大多數(shù)人都遺漏了什么。很多人一般先從處理器的架構(gòu)開始,看看該處理器采用了什么架構(gòu),相比上一代或者競爭對手的CPU在架構(gòu)上都有什么改進或者優(yōu)勢。 其次,再看這款CPU與同檔次的處理器的主頻孰高孰低,默認高主頻的處理器一般是采用較好的晶圓來制造的,穩(wěn)定性更好,再次是看該處理器的緩存容量有多少(尤其是Intel的處理器非常依賴緩存),緩存充當處理器與緩存之間的橋梁,起到一定的數(shù)據(jù)緩沖作用。 ![]() 全面了解處理器 最后我們要看該處理器采用的制程,一般制程越先進,發(fā)熱量越低,而相對越好超,而比較關注節(jié)能性能的網(wǎng)友,還會著重看該處理器的功耗為多少。那么我們看完這些參數(shù)是不是漏了些什么呢? 其實仔細想想,我們會恍然大悟,還有該處理器支持的指令集。處理器單靠里面的硬件電路是不會計算的,必須依靠指令來計算和控制系統(tǒng)。 ● CPU指令集至關重要 每款CPU設計的時候就制定了一套與內(nèi)部電路配合的指令系統(tǒng),從具體運用看,我們可以在很多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(Multi Media eXtension,多媒體擴展指令集)指令集是英特爾于1996年推出,主要用于多媒體指令增強。 MMX指令集中包括有57條多媒體指令,通過這些指令可以一次處理多個數(shù)據(jù),在處理結(jié)果超過實際處理能力的時候也能進行正常處理。MMX的益處在于,當時存在的操作系統(tǒng)不必為此而做出任何修改便可以輕松地執(zhí)行MMX程序。 支持MMX的處理器擁有8個MMX寄存器,每個有64-bit(8byte)的容量。MMX僅支持整數(shù)操作,支持1/2/4/8-bytes數(shù)據(jù)。那即是說,一個MMX寄存器能夠儲存8/4/2/1個操作。這造成了MMX指令集與x87浮點運算指令不能夠同時執(zhí)行,必須做密集式的交錯切換才可以正常執(zhí)行,這種情況就勢必造成整個系統(tǒng)運行質(zhì)量的下降。目前AMD和和英特爾處理器都支持這一指令集。 ● 3D NOW!加速三維渲染 3DNow!指令集是由AMD提出的,廣泛應用于其K6-2 、K6-3以及Athlon(K7)處理器上。3DNow!跟后面提到的SSE非常類似,但也有一些不同。它擁有 8個新的寄存器,卻是64-bit的,并非128-bit。這樣,它只能存儲兩個浮點數(shù)據(jù),而非四個。
K6處理器開始具有3D NOW!指令集 3DNow!可以執(zhí)行操作:相加/相乘 /相除運算,精確或者近似平分根。3DNow!指令集技術(shù)其實就是21條機器碼的擴展指令集。3DNow!指令集主要針對三維建模、坐標變換 和效果渲染等三維應用場合,在軟件的配合下,可以大幅度提高3D處理性能。后來在Athlon上開發(fā)了Enhanced 3DNow!。
SSE全拼是Streaming SIMD Extension,中文名稱為SIMD擴展流。SIMD英文全稱為 Single Istruction Multiple Data(單指令多數(shù)據(jù)),即一條指令可以完成多個操作。SSE是為提供處理器浮點性能而開發(fā)的擴展指令集。 SSE指令集包括了70條指令,其中包含單指令多數(shù)據(jù)浮點計算、以及額外的SIMD整數(shù)和高速緩存控制指令。其優(yōu)勢包括:更高分辨率的圖像瀏覽和處理、高質(zhì)量音頻、MPEG2視頻、同時MPEG2加解密;語音識別占用更少CPU資源;更高精度和更快響應速度。 SSE指令與3DNow!指令彼此互不兼容,但SSE包含了3DNow!技術(shù)的絕大部分功能,只是實現(xiàn)的方法不同。SSE兼容MMX指令,它可以通過SIMD和單時鐘周期并行處理多個浮點數(shù)據(jù)來有效地提高浮點運算速度。 SSE(Streaming SIMD Extensions)是英特爾在AMD的3D Now!發(fā)布一年之后,在其計算機芯片Pentium III中引入的指令集,是MMX的超集。AMD后來在Athlon XP中加入了對這個指令集的支持。這個指令集增加了對8個128位寄存器XMM0-XMM7的支持,每個寄存器可以存儲4個單精度浮點數(shù)。使用這些寄存器的程序必須使用FXSAVE和FXRSTR指令來保持和恢復狀態(tài)。但是在Pentium III對SSE的實現(xiàn)中,浮點數(shù)寄存器又一次被新的指令集占用了,但是這一次切換運算模式不是必要的了,只是SSE和浮點數(shù)指令不能同時進入CPU的處理線而已。 ● SSE2 更精確處理浮點數(shù) SSE2是英特爾為了應對AMD的3Dnow!+指令集,在SSE的基礎上開發(fā)了SSE2,增加了一些指令,使得其處理器性能有大幅度提高。 最早在Pentium 4處理器的最初版本中引入,AMD后來在Opteron 和Athlon 64處理器中也加入了SSE2的支持。到P4設計結(jié)束為止,Intel增加了一套包括144條新建指令的SSE2指令集。SSE2涉及了多重的數(shù)據(jù)目標上立刻執(zhí)行一單個的指令(即SIMD)。最重要的是SSE2能處理128位和兩倍精密浮點數(shù)學運算。 處理更精確浮點數(shù)的能力使SSE2成為加速多媒體程序、3D處理工程以及工作站類型任務的基礎配置。 SSE2指令集添加了對64位雙精度浮點數(shù)的支持,以及對整型數(shù)據(jù)的支持,也就是說這個指令集中所有的MMX指令都是多余的了,同時也避免了占用浮點數(shù)寄存器。這個指令集還增加了對CPU快取的控制指令。AMD對它的擴展增加了8個XMM寄存器,但是需要切換到64位模式(AMD64)才可以使用這些寄存器。Intel后來在其EM64T架構(gòu)中也增加了對AMD64的支持。
SSE3指令集是規(guī)模最小的指令集,此前MMX包含有57條命令,SSE包含有50條命令,SSE2包含有144條命令,SSE3包含有13條命令。此外Intel害針對SSE3指令集作了一次額外擴充,那就是SSSE3是,最早內(nèi)建于Core 2 Duo處理器中。 SSE3指令集共分為5個應用層: 第一層是“數(shù)據(jù)傳輸”,只有一條指令:FISTTP,它有利于x87浮點轉(zhuǎn)換成整數(shù),并可以大大提高優(yōu)化的效率。 第二層是“數(shù)據(jù)處理”,指令共有五條,分別是ADDSUBPS,ADDSUBPD,MOVSHDUP,MOVSLDUP,MOVDDUP。這些指令可以簡化復雜數(shù)據(jù)的處理過程,由于未來數(shù)據(jù)處理流量將會越來越大,因此Intel在這里應用的指令集最多、達到了五條。 第三層是“特殊處理”,也只有一條:LDDQU。在這條指令主要針對視頻解碼,用來提高處理器對處理媒體數(shù)據(jù)結(jié)果的精確性。 第四層是“優(yōu)化”,共有四條指令,分別是HADDPS,HSUBPS,HADDPD,HSUBPD,它們可以對程序起到自動優(yōu)化的作用,對處理3D圖形相當有用。 第五層是“超線程性能增強”,共有兩條針對線程處理的指令:MONITOR, MWAIT,這有助于增加Intel超線程的處理能力、大大簡化了超線程的數(shù)據(jù)處理過程。 ● SSE4.1改進視頻處理 SSE4.1是Intel在Penryn核心的Core 2 Duo與Core 2 Solo處理器時,新增的47條新多媒體指令集,用來加強視頻編輯等方面的應用。另外,AMD也開發(fā)了屬于自己的SSE4a多媒體指令集,并內(nèi)建在Phenom與Opteron等K10架構(gòu)處理器中,不過相關應用都差不多,并且無法與Intel的SSE4系列指令集相容。 據(jù)了解,在進行視頻編碼時需要進行動態(tài)預測(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 便完全代替了以上繁復的指令串,大幅提升動態(tài)預測(Motion Estimation)及差分編碼的運算速度。 |
|
|