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