處理器的大腦 讀(du)懂CPU指令集
在(zai)我(wo)們(men)對(dui)一(yi)款CPU進(jin)行(xing)全面的(de)(de)了解的(de)(de)時候(hou),我(wo)們(men)看(kan)看(kan)大多(duo)數人都遺(yi)漏了什么(me)。很多(duo)人一(yi)般先從(cong)處理器的(de)(de)架(jia)構(gou)開(kai)始,看(kan)看(kan)該處理器采用了什么(me)架(jia)構(gou),相比(bi)上一(yi)代或者競爭對(dui)手的(de)(de)CPU在(zai)架(jia)構(gou)上都有什么(me)改進(jin)或者優勢。
其(qi)次(ci),再看(kan)這(zhe)款CPU與同(tong)檔(dang)次(ci)的(de)(de)(de)(de)處(chu)理(li)器(qi)的(de)(de)(de)(de)主頻孰高(gao)孰低,默認(ren)高(gao)主頻的(de)(de)(de)(de)處(chu)理(li)器(qi)一般(ban)是采用(yong)(yong)較好(hao)的(de)(de)(de)(de)晶圓(yuan)來(lai)制造的(de)(de)(de)(de),穩定(ding)性更好(hao),再次(ci)是看(kan)該處(chu)理(li)器(qi)的(de)(de)(de)(de)緩存容(rong)量有多少(尤(you)其(qi)是Intel的(de)(de)(de)(de)處(chu)理(li)器(qi)非常(chang)依賴緩存),緩存充當處(chu)理(li)器(qi)與緩存之間(jian)的(de)(de)(de)(de)橋梁,起(qi)到一定(ding)的(de)(de)(de)(de)數據緩沖(chong)作用(yong)(yong)。
全面了解處理器
最(zui)后我們(men)要看(kan)該處理(li)器采用的(de)制(zhi)程,一般制(zhi)程越先進,發(fa)熱量越低,而相(xiang)對越好超,而比較關注節能性能的(de)網友(you),還會(hui)著重看(kan)該處理(li)器的(de)功耗為多少。那么(me)我們(men)看(kan)完這些(xie)參數是不是漏了些(xie)什(shen)么(me)呢?
其實仔細想想,我們(men)會(hui)恍然大悟,還有(you)該(gai)處理(li)器支持的指令集。處理(li)器單靠(kao)(kao)里面的硬(ying)件(jian)電(dian)路是(shi)不會(hui)計算(suan)的,必須依靠(kao)(kao)指令來計算(suan)和控制(zhi)系統。
● CPU指令集至關重要
每款(kuan)CPU設(she)計的時候就制定了一套與內部電路配合的指(zhi)令系(xi)統,從具體運用看(kan),我們可以(yi)在(zai)很多CPU身上看(kan)到(dao)的就有(you)MMX(Multi Media Extended)、SSE(Streaming SIMD Extensions)、SSE2、SSE3、SSSE3、SSE4(分為(wei)SSE4.1與SSE4.2兩(liang)代,AMD的SSE4A包(bao)含在(zai)SSE4里面,這個后面會提到(dao)),另外還有(you)AMD的3D NOW!系(xi)列。
這(zhe)些(xie)指令集可謂大大增強了CPU的多媒(mei)體(ti)、圖形(xing)圖象和Internet等的處理能力,下面就讓我們(men)逐個了解下。
● MMX增強多媒體表現
MMX(Multi Media eXtension,多(duo)(duo)媒體擴展指令集(ji))指令集(ji)是英特爾于1996年推出(chu),主要用于多(duo)(duo)媒體指令增強。
MMX指令集中包括有57條多(duo)媒體(ti)指令,通(tong)過這些(xie)指令可以(yi)一次處(chu)(chu)理(li)多(duo)個數據,在(zai)處(chu)(chu)理(li)結果超過實(shi)際(ji)處(chu)(chu)理(li)能力(li)的時(shi)候(hou)也能進行正常處(chu)(chu)理(li)。MMX的益處(chu)(chu)在(zai)于,當時(shi)存在(zai)的操作系統(tong)不必為此而做出任何(he)修(xiu)改便可以(yi)輕松地執(zhi)行MMX程序(xu)。
支持(chi)MMX的(de)處理器(qi)擁有8個(ge)MMX寄存器(qi),每個(ge)有64-bit(8byte)的(de)容量。MMX僅支持(chi)整數操作(zuo),支持(chi)1/2/4/8-bytes數據。那即是(shi)說,一(yi)個(ge)MMX寄存器(qi)能(neng)夠(gou)儲(chu)存8/4/2/1個(ge)操作(zuo)。這造成了MMX指(zhi)令集與x87浮點運(yun)算指(zhi)令不能(neng)夠(gou)同(tong)時執(zhi)行,必須做密集式(shi)的(de)交錯(cuo)切換才可以正常執(zhi)行,這種情況就勢必造成整個(ge)系統(tong)運(yun)行質(zhi)量的(de)下降。目前AMD和和英特(te)爾處理器(qi)都支持(chi)這一(yi)指(zhi)令集。
● 3D NOW!加速三維渲染
3DNow!指令集(ji)是由AMD提出(chu)的(de),廣泛(fan)應(ying)用于其K6-2 、K6-3以及Athlon(K7)處(chu)理器(qi)上。3DNow!跟后面提到的(de)SSE非(fei)常(chang)類似,但也有(you)一些不(bu)同。它擁有(you) 8個(ge)新的(de)寄存器(qi),卻是64-bit的(de),并非(fei)128-bit。這樣,它只能存儲(chu)兩個(ge)浮點數據,而非(fei)四個(ge)。
K6處理器開始具有3D NOW!指令集
3DNow!可以(yi)執行操作:相加/相乘 /相除(chu)運(yun)算,精確或(huo)者近似平(ping)分根。3DNow!指(zhi)(zhi)令(ling)集(ji)技術(shu)其(qi)實就是21條機器碼(ma)的(de)擴展指(zhi)(zhi)令(ling)集(ji)。3DNow!指(zhi)(zhi)令(ling)集(ji)主(zhu)要(yao)針對三維(wei)建模、坐標(biao)變(bian)換 和效(xiao)果渲(xuan)染等三維(wei)應用場合,在(zai)軟件的(de)配合下,可以(yi)大幅度提高3D處理性(xing)能。后來在(zai)Athlon上(shang)開發了Enhanced 3DNow!。
● SSE加快處理多媒體應用
SSE全(quan)拼是Streaming SIMD Extension,中文名稱(cheng)為(wei)SIMD擴(kuo)展流。SIMD英文全(quan)稱(cheng)為(wei) Single Istruction Multiple Data(單指令(ling)多數據(ju)),即一(yi)條指令(ling)可以完成多個操作。SSE是為(wei)提供處理器浮點性能而開發的擴(kuo)展指令(ling)集。
SSE指(zhi)令(ling)(ling)集包括(kuo)了70條指(zhi)令(ling)(ling),其(qi)中包含單(dan)指(zhi)令(ling)(ling)多數據浮點(dian)計算、以及額外(wai)的SIMD整數和高速緩存控制指(zhi)令(ling)(ling)。其(qi)優勢(shi)包括(kuo):更高分辨率(lv)的圖像瀏覽和處理、高質量音(yin)頻、MPEG2視頻、同時MPEG2加解密(mi);語音(yin)識別占用更少CPU資源;更高精度和更快響應速度。
SSE指(zhi)令(ling)(ling)與(yu)3DNow!指(zhi)令(ling)(ling)彼此互(hu)不兼容(rong),但SSE包含(han)了3DNow!技術(shu)的絕大(da)部分功能,只是實現的方法不同。SSE兼容(rong)MMX指(zhi)令(ling)(ling),它可以通(tong)過SIMD和單(dan)時鐘周(zhou)期并(bing)行處理多個浮點(dian)數據來(lai)有效(xiao)地提高浮點(dian)運算速度。
SSE(Streaming SIMD Extensions)是英特爾在(zai)(zai)AMD的(de)(de)(de)3D Now!發(fa)布一(yi)年之后(hou),在(zai)(zai)其計算(suan)機芯片Pentium III中(zhong)引入的(de)(de)(de)指(zhi)(zhi)(zhi)令(ling)集(ji)(ji),是MMX的(de)(de)(de)超集(ji)(ji)。AMD后(hou)來在(zai)(zai)Athlon XP中(zhong)加(jia)入了(le)對(dui)這個指(zhi)(zhi)(zhi)令(ling)集(ji)(ji)的(de)(de)(de)支持。這個指(zhi)(zhi)(zhi)令(ling)集(ji)(ji)增加(jia)了(le)對(dui)8個128位寄(ji)存器(qi)(qi)XMM0-XMM7的(de)(de)(de)支持,每個寄(ji)存器(qi)(qi)可以存儲4個單精度浮(fu)點數(shu)。使用這些(xie)寄(ji)存器(qi)(qi)的(de)(de)(de)程序必(bi)須使用FXSAVE和(he)FXRSTR指(zhi)(zhi)(zhi)令(ling)來保持和(he)恢復(fu)狀態。但(dan)是在(zai)(zai)Pentium III對(dui)SSE的(de)(de)(de)實現中(zhong),浮(fu)點數(shu)寄(ji)存器(qi)(qi)又一(yi)次被(bei)新的(de)(de)(de)指(zhi)(zhi)(zhi)令(ling)集(ji)(ji)占用了(le),但(dan)是這一(yi)次切(qie)換運算(suan)模式不是必(bi)要的(de)(de)(de)了(le),只(zhi)是SSE和(he)浮(fu)點數(shu)指(zhi)(zhi)(zhi)令(ling)不能同(tong)時進入CPU的(de)(de)(de)處理線而(er)已。
● SSE2 更精確處理浮點數
SSE2是(shi)英特爾為(wei)了(le)應對AMD的3Dnow!+指(zhi)令集,在SSE的基礎上(shang)開發了(le)SSE2,增(zeng)加(jia)了(le)一些指(zhi)令,使得其處(chu)理器性能有大幅度提高(gao)。
最(zui)早(zao)在(zai)Pentium 4處(chu)(chu)理器的最(zui)初(chu)版(ban)本中(zhong)引入(ru),AMD后來在(zai)Opteron 和Athlon 64處(chu)(chu)理器中(zhong)也(ye)加入(ru)了(le)(le)SSE2的支持(chi)。到P4設計結束為止(zhi),Intel增(zeng)加了(le)(le)一(yi)套包括144條新建指(zhi)令的SSE2指(zhi)令集(ji)。SSE2涉及了(le)(le)多重的數據目(mu)標上立刻執(zhi)行一(yi)單個的指(zhi)令(即SIMD)。最(zui)重要的是SSE2能(neng)處(chu)(chu)理128位和兩(liang)倍(bei)精(jing)密浮點數學運算。
處理更精確浮點(dian)數的(de)(de)能力使SSE2成為加速多媒體程序(xu)、3D處理工程以及工作(zuo)站(zhan)類型任務(wu)的(de)(de)基礎配置。
SSE2指令集添(tian)加(jia)了對(dui)64位(wei)(wei)雙精度浮(fu)點(dian)數的(de)支(zhi)(zhi)持,以(yi)及對(dui)整型(xing)數據的(de)支(zhi)(zhi)持,也(ye)就是說(shuo)這個指令集中(zhong)所(suo)有的(de)MMX指令都是多(duo)余的(de)了,同時也(ye)避(bi)免了占用浮(fu)點(dian)數寄存(cun)器。這個指令集還增(zeng)加(jia)了對(dui)CPU快取的(de)控制指令。AMD對(dui)它的(de)擴展增(zeng)加(jia)了8個XMM寄存(cun)器,但是需要切換到64位(wei)(wei)模式(AMD64)才可以(yi)使用這些寄存(cun)器。Intel后(hou)來(lai)在其(qi)EM64T架構中(zhong)也(ye)增(zeng)加(jia)了對(dui)AMD64的(de)支(zhi)(zhi)持。
● SSE3促進五個應用
SSE3指令(ling)(ling)集是(shi)規模最小的指令(ling)(ling)集,此前(qian)MMX包(bao)含有57條(tiao)命(ming)令(ling)(ling),SSE包(bao)含有50條(tiao)命(ming)令(ling)(ling),SSE2包(bao)含有144條(tiao)命(ming)令(ling)(ling),SSE3包(bao)含有13條(tiao)命(ming)令(ling)(ling)。此外Intel害(hai)針(zhen)對SSE3指令(ling)(ling)集作了一次(ci)額(e)外擴充,那就是(shi)SSSE3是(shi),最早(zao)內建于Core 2 Duo處(chu)理器中。
SSE3指(zhi)令(ling)集(ji)共分為5個應用層(ceng): 第(di)(di)一(yi)層(ceng)是(shi)“數(shu)據(ju)傳輸”,只(zhi)(zhi)有(you)一(yi)條(tiao)指(zhi)令(ling):FISTTP,它有(you)利于(yu)(yu)x87浮點轉換成(cheng)整數(shu),并可(ke)以(yi)大(da)大(da)提高(gao)優(you)化的(de)(de)效(xiao)率(lv)。 第(di)(di)二層(ceng)是(shi)“數(shu)據(ju)處(chu)(chu)理(li)(li)(li)”,指(zhi)令(ling)共有(you)五條(tiao),分別(bie)是(shi)ADDSUBPS,ADDSUBPD,MOVSHDUP,MOVSLDUP,MOVDDUP。這(zhe)些指(zhi)令(ling)可(ke)以(yi)簡化復雜數(shu)據(ju)的(de)(de)處(chu)(chu)理(li)(li)(li)過程,由于(yu)(yu)未來數(shu)據(ju)處(chu)(chu)理(li)(li)(li)流量(liang)將會越來越大(da),因此Intel在這(zhe)里(li)應用的(de)(de)指(zhi)令(ling)集(ji)最多、達到(dao)了(le)五條(tiao)。 第(di)(di)三層(ceng)是(shi)“特殊(shu)處(chu)(chu)理(li)(li)(li)”,也只(zhi)(zhi)有(you)一(yi)條(tiao):LDDQU。在這(zhe)條(tiao)指(zhi)令(ling)主要針對(dui)視(shi)頻解碼,用來提高(gao)處(chu)(chu)理(li)(li)(li)器(qi)對(dui)處(chu)(chu)理(li)(li)(li)媒體數(shu)據(ju)結果的(de)(de)精(jing)確性(xing)。 第(di)(di)四(si)層(ceng)是(shi)“優(you)化”,共有(you)四(si)條(tiao)指(zhi)令(ling),分別(bie)是(shi)HADDPS,HSUBPS,HADDPD,HSUBPD,它們(men)可(ke)以(yi)對(dui)程序起(qi)到(dao)自動優(you)化的(de)(de)作用,對(dui)處(chu)(chu)理(li)(li)(li)3D圖形相當(dang)有(you)用。 第(di)(di)五層(ceng)是(shi)“超線程性(xing)能增強”,共有(you)兩條(tiao)針對(dui)線程處(chu)(chu)理(li)(li)(li)的(de)(de)指(zhi)令(ling):MONITOR, MWAIT,這(zhe)有(you)助于(yu)(yu)增加Intel超線程的(de)(de)處(chu)(chu)理(li)(li)(li)能力、大(da)大(da)簡化了(le)超線程的(de)(de)數(shu)據(ju)處(chu)(chu)理(li)(li)(li)過程。
● SSE4.1改進視頻處理
SSE4.1是Intel在(zai)(zai)Penryn核心的Core 2 Duo與Core 2 Solo處理(li)器(qi)時(shi),新增的47條新多媒體指令集(ji)(ji),用來加(jia)強視(shi)頻(pin)編輯等(deng)方面的應(ying)用。另外,AMD也開發了屬(shu)于自己的SSE4a多媒體指令集(ji)(ji),并內建在(zai)(zai)Phenom與Opteron等(deng)K10架構處理(li)器(qi)中,不過相(xiang)關應(ying)用都差不多,并且無法(fa)與Intel的SSE4系列指令集(ji)(ji)相(xiang)容。
據了解(jie),在(zai)進行(xing)視頻編碼(ma)時(shi)需(xu)(xu)要進行(xing)動態預(yu)測(Motion Estimation)及差分編碼(ma)方(fang)式去除相鄰(lin)2張影像之相關(guan)性,這是一個(ge)非(fei)常復雜的運(yun)算(suan)動作。在(zai)沒有(you)SSE4指(zhi)令集時(shi),完(wan)成一個(ge)步驟需(xu)(xu)要以下指(zhi)令語句:
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;
…
… }
}
一(yi)大串的(de)(de)指(zhi)令(ling)極度浪費處理(li)器資源,而在支持SSE4指(zhi)令(ling)集的(de)(de)處理(li)器上,只需(xu)要采用4 SAD運(yun)(yun)算(suan)指(zhi)令(ling):MPSADBW xmm0,xmm1,0便完全代(dai)替了(le)以上繁復的(de)(de)指(zhi)令(ling)串,大幅提(ti)升動態預測(Motion Estimation)及差分編碼的(de)(de)運(yun)(yun)算(suan)速度。