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