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