指令集是指CPU能執行的所有指令的集合,每一指令對應一種操作,任何程序最終要編譯成一條條指令才能讓CPU識別並執行。CPU依靠指令來計算和控制系統,所以指令強弱是衡量CPU性能的重要指標,指令集也成為提高CPU效率的有效工具。
CPU都有一個基本的指令集,比如說目前英特爾和AMD的絕大部分處理器都使用的是X86指令集,因為它們都源自於X86架構。但無論CPU有多快,X86指令也只能一次處理一個數據,這樣效率就很低下,畢竟在很多應用中,數據都是成組出現的,比如一個點的坐標(XYZ)和顏色(RGB)、多聲道音頻等。為了提高CPU在某些方面的性能,就必須增加一些特殊的指令滿足時代進步的需求,這些新增的指令就構成了擴展指令集。
英特爾CPU擴展指令集演變
英特爾在1996年率先引入了MMX(Multi Media eXtensions)多媒體擴展指令集,也開創了SIMD(Single Instruction Multiple Data,單指令多數據)指令集之先河,即在一個周期內一個指令可以完成多個數據操作,MMX指令集的出現讓當時的MMX Pentium大出風頭。
英特爾處理器擴展指令集演變史(圖片來源后藤弘茂)
SSE(Streaming SIMD Extensions,流式單指令多數據擴展)指令集是1999年英特爾在Pentium III處理器中率先推出的,並將矢量處理能力從64位擴展到了128位。在Willamette核心的Pentium 4中英特爾又將擴展指令集升級到SSE2(2000年),而SSE3指令集(2004年)是從Prescott核心的Pentium 4開始出現。
SSE4(2007年)指令集是自SSE以來最大的一次指令集擴展,它實際上分成Penryn中出現的SSE4.1和Nehalem中出現的SSE4.2,其中SSE4.1占據了大部分的指令,共有47條,Nehalem中的SSE4指令集更新很少,只有7條指令,這樣一共有54條指令,稱為SSE4.2。
Sandy Bridge支持AVX指令集
當我們還在慣性的認為英特爾將推出SSE5時,不料半路殺出來個程咬金,2007年8月,AMD搶先宣布了SSE5指令集(SSE到SSE4均為英特爾出品),英特爾當即黑臉表示不支持SSE5,轉而在2008年3月宣布Sandy Bridge微架構將引入全新的AVX指令集,同年4月英特爾公布AVX指令集規范,隨后開始不斷進行更新,業界普遍認為支持AVX指令集是Sandy Bridge最重要的進步,沒有之一。
英特爾AVX指令集簡介
AVX(Advanced Vector Extensions,高級矢量擴展)指令集借鑒了一些AMD SSE5的設計思路,進行擴展和加強,形成一套新一代的完整SIMD指令集規范。
IDF2010上演示AVX應用
在今年4月的IDF2010上,英特爾演示了AVX的應用,在兩個不同平台上動態跟蹤劉翔運行服上的五星紅旗,結果顯示,支持AVX的系統視頻跟蹤的用時為14秒,比不支持AVX的系統快了21秒,性能提升了60%以上。
有興趣的讀者可以點擊觀看AVX應用主題演講視頻,時間大概在第33分鍾左右。
英特爾AVX的新特性
英特爾AVX指令集主要在以下幾個方面得到擴充和加強:
·支持256位矢量計算,浮點性能最大提升2倍
·增強的數據重排,更有效存取數據
·支持3操作數和4操作數,在矢量和標量代碼中能更好使用寄存器
·支持靈活的不對齊內存地址訪問
·支持靈活的擴展性強的VEX編碼方式,可減少代碼
支持256位矢量計算
自1999年SSE將矢量處理能力從64位提升到128位后,SSE系列指令都只能使用128位XMM寄存器,這次AVX將所有16個128位XMM寄存器擴充為256位的YMM寄存器,從而支持256位的矢量計算。
128位的XMM寄存器擴展到256位的YMM寄存器
這意味着可以同時處理8個32bit的浮點或是一個256bit的浮點,在寫程序時可以忽略SSE 128bit的限制,直接寫入一個可以進行多組操作,能夠充分利用256bit數據位寬的代碼,理想狀態下,浮點性能最高能達到前代的2倍水平。
當然有時並不是能完全能利用這256位,在大多數情況下,這些寄存器的高128位是設為0或者是“left unchanged”,同時所有的SSE/SSE2/SSE3/SSSE3/SSE4指令是被AVX全面兼容的(AVX不兼容MMX),因此實際操作的是YMM寄存器的低128位,在這一點上與原來的SSE系列指令集無異。
Sandy Bridge最突出的部分
為了滿足指令集帶來的改進,Load載入單元也要適應一次載入256Bit的能力,所以增加了一組載入單元完成載入操作,並不是單純的將帶寬擴展一倍。這樣可以在一個時鍾周期內實現256位的乘、加和Shuffle運算。
使用新的256位寄存器來提升數據I/O效率,更好的標記、傳播載入的數據,動態的改變數據序列,以此來組織、訪問和載入運算所需的數據,速度更快效率更高。
AVX增加了很多新的浮點運算指令
AVX還引入了很多新的浮點運算指令,浮點運算能力加強,不光提升了3D游戲,還可以更有效的支持如復雜的flash顯示,更快的SVG(可伸縮矢量圖形)支持,更好的HTML5效果等等,相比用GPU計算來講功耗更小,體積更小,成本也小,對GPU計算是個不大不小的沖擊。
支持3操作數和4操作數
通常一條計算機指令包括有操作碼和操作數(operands),操作碼決定要完成的操作,操作數指參加運算的數據及其所在的單元地址。比如movaps xmm1, xmm0就是一個雙操作數,SSE指令movaps為操作碼,其功能是將xmm0寄存器的內容復制給xmm1。
新的3操作數和4操作數格式
AVX指令集改進和加強了原有的在3個操作數指令的編碼和語法,使之更靈活。比如要實現 xmm10 = xmm9 + xmm1 的功能,以前需要兩個指令執行:
movapps xmm10, xmm9 將xmm9寄存器數據copy到xmm10
addpd xmm10, xmm1 將xmm1和xmm10寄存器數據相加,並存放到xmm10
應用AVX指令集新的3操作數方式,可以直接由一條指令就能完成:
vaddpd xmm10, xmm9, xmm1
顯然AVX三操作數能帶來更少的寄存器復制,並且代碼也更精簡。
4操作數雖然是AMD在SSE5中首先提出的,但英特爾的AVX也能支持這一方式,其最終收益是對AVX 128和AVX 256使用非破壞性語法,減少寄存器間的拷貝,精簡代碼,增加load/op fusion的機會。
movaps xmm0, xmm4
movaps xmm1, xmm2
blendvps xmm1, m128
比如上面的三條指令,利用4操作數,可以不需要使用隱含的xmm0,直接由下面一條指令完成:
vblendvps xmm1, xmm2, m128, xmm4
支持靈活的不對齊內存地址訪問
CPU在工作時只能按照內部數據位寬長度(比如說32bit)的整倍數為邊界進行內存操作,即只能從地址0、32、64、96...處進行存取,而不能從27、58、83等非邊界地址處進行。如果一定要取這些非邊界地址處的內容,則必須用若干個操作將其湊出來,因而大大影響存取效率。
一個結構體的設計長度卻並不一定是32的倍數,例如一個六個字符的結構其長度為48位,如果多個這樣的結構在內存中順着擺放,則許多結構的起始地址將不在邊界處,因此編譯程序總是會將每個結構的尾部都加入一些必要的空白,將其湊成32的整數倍,這就是邊界對齊的基本道理。
傳統的指令中,當訪問不對齊內存(unaligned memory access)時,需要相當大的訪問周期,甚至會有懲罰性延時,極大地降低速度。
而在AVX指令集中,以VEX前綴編碼的算術指令和內存訪問指令在訪問內存時更靈活,既可訪問對齊的內存地址,也可訪問未對齊的數據。當然訪問未對齊數據,多少都會有損失,但相對傳統的指令來說,所承受的懲罰要小得多。
革新的VEX指令編碼方式
英特爾在2008年春天的IDF上介紹AVX的時候就表示AVX的重點在於采用了稱為“VEX (Vector Extension)”革新的指令編碼方式。
VEX編碼指令解決方案
x86指令集容易擴張,但是每次對於新指令和新數據類型的增加,都會在操作碼(opcode)之前增加了一個字節的前綴(prefix),從而實現對擴展的支持。這樣的就帶來指令集的復雜化和命令長度增加,從而導致二進制的冗余和增加CPU命令解碼硬件的復雜性。
VEX編碼方式解決了這個問題,VEX的構想,就是壓縮prefix中包含的信息,在1個字節的payload中全部包括了prefix的內容,這樣縮短指令長度,從而極大地降低了無謂的code size浪費。並且在今后導入的新的寄存器中,128bits或更長的256bits的數據,也將在payload中壓縮。
Intel AVX vs. AMD XOP(圖片來源后藤弘茂)
VEX prefix分為2個字節和3個字節的版本,即前綴部分使用C4h和C5h。AMD的XOP指令集采用了類似的方式,XOP前綴字節改成了8Fh,雖然前綴不同,但是payload部分的格式與VEX是相同的。AVX的VEX的編碼系統,也反應了英特爾處理器今后的進化趨勢,它解決了x86系列CPU在解碼能力上的不足。
AVX是Sandy Bridge最重要的改進
AVX相對SSE帶來的處理速度提升
英特爾AVX指令集將矢量處理能力提升到256bit,理論上可以讓CPU的浮點性能最大提升兩倍,而且革新的VEX編碼方式也突破x86在解碼方面的瓶頸,非常值得期待。
由於AMD的SSE5和AVX指令集功能類似,並且AVX包含更多的優秀特性,雖然SSE5是要早於AVX宣布的,但在去年AMD還是決定支持AVX,避免讓開發者徒增開發難度。同時AMD改寫SSE5,重定義為XOP、CVT16和FMA4指令集。AMD有關人員甚至暗示由於受到了AVX指令集影響,Bulldozer的計划從2010年延遲到了2011年。
AVX作為Sandy Bridge處理器最重要的改進,在幾天后將閃亮登場,除硬件支持外,軟件上的支持也是必不可少的,所幸的是Windows 7 SP1已經開始支持英特爾AVX指令集了。
轉自:https://www.expreview.com/13236.html