天天看點

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

從Pentium III到扣肉 SSE指令集發展曆程回顧

作者:八戒 出處:天極網 責任編輯: 寒冬 [ 2006-08-24 00:01 ] 前言:

  自最簡單的 電腦開始,指令序列便能取得運算對象,并對它們執行計算。對大多數電腦而言,這些指令同時隻能執行一次計算。如需完成一些并行操作(如立體聲左、右聲道,或顯示器的紅、綠、藍混合),就要連續執行多次計算。此類電腦采用的是“單指令單資料”(SISD)處理器。

  然而,現實世界的大多數計算都會同SISD模型沖突。比如對麥克風傳來的左、右立體聲道進行簡單過濾處理時,需将之前的幾個采樣值累加起來,再同目前值加到一起,再除以采樣次數,必須重複計算左、右聲道。看來似乎頗為簡單,但在實際應用中,每次采樣都必須作同樣的計算。如決定使用CD音質,那麼每秒種都要對左、右聲道執行44100次采樣,總共便要計算88200次。

  為獲得LeftSum和RightSum的結果,分别要執行6條指令。是以為確定獲得連貫的CD音質,每秒鐘要執行的指令總數為:44100次采樣×2個聲道×6條指令=529000條!電腦顯示的道理與此相似,但情況會糟得多—想想在1024×768的分辨率和24位真彩色下,假定每秒顯示30幀(雖然好但非特别出色的3D加速性能),僅僅為了通路每個像素,而不做任何實際工作,每秒便要執行70778880條指令,這顯然是個沉重的負擔。設想一下,假如有這樣的一種處理器,雖然它隻能執行單個指令序列,但能将那些指令同時應用于幾個獨立的資料流,速度顯然就會快上許多。我們稱之為“單指令多資料”(SIMD)處理器。而我們平常所說的SSE(Streaming SIMD Extensions)便屬于此類單指令多資料。

  自SSE起,到目前已經曆經4代,每一次改進都為我們帶來或多或少的驚喜。是以今天我們就簡單介紹一下SSE的發展曆程,希望能對你在了解處理器技術發展時有所幫助。

一、SSE指令集

  在了解SSE之前,我們先說說多媒體指令集的發展。在SSE釋出之前,英特爾的P2主要以MMX多媒體指令集為主。不過随着AMD釋出K6-2,MMX早已經成為曆史,取代它的是“3D NOW!”和SSE。AMD當時的“3D NOW!”把提升CPU的3D效能作為一個主要要求,在相當程度上彌補了AMDK6晶片浮點處理能力上的不足,使得廉價的非Intel晶片能夠擁有超過奔騰的3D性能,是以K6-2在市場上大獲成功,使得Intel的PⅡ備受打擊,并直接導緻了Intel“新賽揚”的出籠。

  “3D NOW!”如此成功,以緻它成了AMD的一大驕傲,并不斷在它的基礎上改進加強,一直在Athlon上還能見到它的身影。為此,Intel在Pentium III中引入更先進的SSE指令集。

  其實,早在PIII正式推出之前,Intel公司就曾經通過各種管道公布過所謂的KNI(Katmai New Instruction)指令集,這個指令集也就是SSE指令集的前身,并一度被很多傳媒稱之為MMX指令集的下一個版本,即MMX2指令集。究其背景,原來“KNI”指令集是Intel公司最早為其下一代晶片命名的指令集名稱,而所謂的“MMX2”則完全是 硬體評論家們和媒體憑感覺和印象對“KNI”的評價,Intel公司其實從未正式釋出過關于MMX2的消息。而最終推出的SSE指令集也就是所謂勝出的“網際網路SSE”指令集。

  SSE指令集包括了70條指令,其中包含提高3D圖形運算效率的50條SIMD(單指令多資料技術)浮點運算指令、12條MMX 整數運算增強指令、8條優化記憶體中連續資料塊傳輸指令。理論上這些指令對目前流行的圖像處理、浮點運算、3D運算、視訊處理、音頻處理等諸多多媒體應用起到全面強化的作用。SSE指令與3DNow!指令彼此互不相容,但SSE包含了3DNow!技術的絕大部分功能,隻是實作的方法不同。SSE相容MMX指令,它可以通過SIMD和單時鐘周期并行處理多個浮點資料來有效地提高浮點運算速度。那麼SSE能為我們帶來什麼呢?

  與P2時代的MMX相比,SSE也是在原來的處理器指令集的基礎上添加的擴充指令集,都是SIMD(單指令多資料)指令,不同的是他們處理的資料類型不同. MMX隻能在整數上支援SIMD,而SSE指令增加了單精度浮點數的SIMD支援.MMX可以進行同時對2個32位的整數操作,而SSE可以同時對4個32位的浮點數操作。MMX和SSE的一個主要的差別是MMX并沒有定義新的寄存器,而SSE定義了8個全新的128位寄存器,每個寄存器可以同時存放4個單精度浮點數(每個32位長),他們在寄存器中排列順序見下圖。

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

新資料類型排列

  這裡有一個問題,既然MMX沒有定義新的寄存器,那麼她又有什麼寄存器可操作呢?事實上,MMX是和原來的浮點寄存器共享的.一個浮點寄存器是80位長的,她的低端64位被用做MMX的寄存器.這樣,一個應用 程式就不能在執行MMX指令的同時進行浮點操作了.同時,處理器還要花掉大量的時鐘周期去維護寄存器狀态從MMX操作和浮點操作之間的切換。SSE指令集就沒有這些限制了。由于她定義了全新的寄存器,應用程式可以在進行整數SIMD操作(MMX)的同時進行浮點數的SIMD操作(SSE),同樣,SSE還可以在執行浮點數的非SIMD操作的同時進行SIMD操作。

  MMX和SSE的寄存器排列見下圖:

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

MMX和SSE的寄存器:(a)是MMX和浮點數共享一個寄存器的情況,(b)是SSE的獨立寄存器排列MMX和SSE寄存器有一個共同點,那就是都有8個寄存器.MMX的寄存器被命名為mm0—mm7,SSE的寄存器名字是xmm0—xmm7。?Pentium III的SSE指令集是為SIMD設計的,她可以同時操作4個單精度浮點值.是以,利用這些加強的浮點計算能力,對3D應用程式的細節表現是有實質性的提高的。事實上,SSE就是為3D應用建立的.遊戲和其他的使用後端3D來顯示2D和2.5D圖象的程式,和使用矢量圖形的應用程式一樣都能分享到這種好處。

  電腦表示的3D圖形是用大量的表示圖形頂點的浮點數組成的,通過操作這些頂點資料就可以改變3D圖形的外觀.通過使用SSE指令集,應用程式可以獲得更多的幫助,處理器可以在一個時鐘周期内處理更多的資料,大大加快了3D圖形的頂點計算速度,可以給使用者帶來更深刻的3D體驗。同樣,應用程式開發者還可以用更多的頂點資料和更複雜的算法來創造出更為生動的3D圖象效果來。使用SSE指令集可以顯著的改善一些在3D操作中經常用到的計算,像矩陣乘法、矩陣變換以及矩陣之間的加、減、乘、向量矩陣相乘、矢量化、 矢量點相乘和光照計算等等。

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

  比如玩Quake時,3D對象均由多邊形構成,而這些多邊形以一系列點的形式儲存。每個點都有對應的3軸坐标。如限制成隻用整數,便不能精确地表示這些位置(如每個坐标軸使用16位,那麼隻能得到65536個坐标點),造成圖形顯示非常糟糕。

  自奔騰開始,Intel各型處理器的浮點運算能力便非常強大,遊戲開發者幾乎都情願選用浮點運算。由于MMX不能對浮點進行操作(更糟的是,從MMX切換到浮點模式時,還會造成性能的瞬間劇降),是以MMX并不能将遊戲提速至比裝置驅動程式更高的一個水準,這正是MMX令許多人失望的原因。假如你用3D加速卡做圖形渲染,遊戲中完成的運算(模拟、3D變形、照明等)會耗去約90%的處理器時間。也就是說,MMX隻為處理器留出了10%的時間來做其它工作,這還是在你使用了3D卡的前提下。

  而SSE可以有效解決了這個問題,除保持原有的MMX指令外,又新增了70條指令,在加快浮點運算的同時,也改善了記憶體的使用效率,使記憶體速度顯得更快一些。對于使用者來說,這意味着3D物體更生動,表面更光滑,“虛拟現實”更“現實”。按Intel當時的說法,SSE對下述幾個領域的影響特别明顯:3D幾何運算及動畫處理;圖形處理(如Photoshop);視訊編輯/壓縮/解壓(如MPEG和DVD);語音識别以及聲音壓縮和合成。

  SSE另一大優點是可以大大減小資料計算的指令操作數目.如果不使用SIMD和SSE,要進行一個400次的浮點數乘法計算,需要循環使用400次的乘法指令。而如果使用了SIMD和SSE,則隻要進行100次的乘法指令就可以完成相同的任務了,因為這裡每次的乘法操作都可以同時對4個浮點數進行計算。

  SSE指令可以說是将Intel的MMX和AMD的3DNow!技朮相結合的産物,由于3DNow!使用的是浮點寄存方式,因而無法較好地同步進行正常的浮點運算。而SSE使用了分離的指令寄存器,進而可以全速運作,保證了與浮點運算的并行性。尤其是兩者所使用的寄存器差異頗大─3DNow!是64位,而SSE是128位。同時為了充分發揮SSE的優勢,Intel引進了新的“處理器分離模式”以提高浮點運算速度。

代表之作:PentiumIII

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

老PentiumIII,挺着眼的!

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

新封裝的PentiumIII

  不過,要發揮SSE的速度優勢,要滿足以下條件:使用DirectX 6 API開發應用程式;使用支援SSE的圖形驅動程式;使用支援“處理器分離模式”的作業系統等。由于SSE要求軟體的資料結構重寫,又比“3D NOW!”晚推出了9個多月,是以市場上使用“3D NOW!”的系統裝機量遠遠超過SSE。基于以上種種原因,SSE一直沒有得到充分的發展。直到Pentium 4釋出之後,開發人員看到使用SSE指令之後,程式執行性能将得到極大的提升,于是Intel又在SSE的基礎上推出了更先進的SSE2指令集。

二、SSE2指令集

  SSE2是Intel第2代浮點多媒體處理器指令集,是英特爾為了應對AMD的3Dnow!+指令集而在SSE的基礎上開發的指令集。它主要增加了144條建立指令,使得其處理器性能有大幅度提高。

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

  SSE2有8個128-bit寄存器,但在這裡不能存儲 4個32-bit的浮點資料,而是 2個64-bit的浮點擴充精度資料。SSE2涉及了多重的資料目标上立刻執行一單個的指令(即SIMD)。最重要的是SSE2能處理128位和兩倍精密浮點數學運算。處理更精确浮點數的能力使SSE2成為加速多媒體程式、3D處理工程以及工作站類型任務的基礎配置,非常适于執行3D渲染、圖形驅動、遊戲和多媒體編碼等應用。而當時Athlon系列處理器支援MMX(整數)和SSE、3DNow!(單精度浮點)等指令集,不過并不支援SSE2。

  共有144個全新的指令可做任何事情,這也是當初SSE2推出所想達成之目标。長度為 128-bit壓縮的資料,在SSE時,該僅能以4個單精确浮點值的形式來處理;但在SSE2下,該資料能選用下列幾種資料表達來處理。

·4個單精确浮點數(SSE)

·2個雙倍精确浮點數(SSE2)

·16個位元組數(SSE2)

·8個字組(word)數(SSE2)

·4個雙倍字組數(SSE2)

·2個四倍字組數(SSE2)

·1個128位長的整數(SSE2)

  由于SSE2可供選擇的資料型态很多,而且無疑地相當有用。 是以,當時Intel 極希望軟體開發者能用SSE2 的雙倍精确浮點指令來取代舊有的 x86 浮點指令,如此一來 Intel所稱 Pentium4是當時FPU 性能最強的處理器這項謠言,最後也就變成了事實。在相關測試中,SSE2對于處理器的性能的提升是十分明顯的,雖然在同頻率的情況下,Pentium 4和性能不如Athlon XP,但由于Athlon XP不支援SSE2,是以經過SSE2優化後的程式Pentium 4的運作速度要明顯高于Athlon XP。而AMD方面也注意到了這一情況,在随後的K-8系列處理器中,都加入SSE2指令集。

代表之作:Pentium 4處理器

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

老Pentium 4

三、SSE3指令集

  SSE3是英特爾在研發Prescott核心時所引入的指令集。它最先被稱為PNI(是Prescott New Instructions的簡稱,Prescott新指令),但它最終改用了一個新的行銷名稱—SSE3。在指令的複雜程度方面,相對于此前的MMX、SSE、SSE2,SSE3似乎要簡潔不少—此前MMX包含有57條指令,SSE包含有50條指令,SSE2包含有144條指令,SSE3包含有13條指令。SSE3指令集這13條指令共分為5個應用層:

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

  第一層中的指令是“資料傳輸指令”,隻有一條指令:FISTTP,它有利于x87浮點轉換成整數,并可以大大提高優化的效率。

  第二層中的指令是“資料處理指令”,一共有五條,分别是ADDSUBPS,ADDSUBPD,MOVSHDUP,MOVSLDUP,MOVDDUP。這些指令可以簡化複雜資料的處理過程,由于未來資料處理流量将會越來越大,是以Intel在這裡應用的指令集最多、達到了五條。

  第三層中的指令是“特殊處理指令”,也隻有一條:LDDQU。在這條指令主要針對視訊解碼,用來提高處理器對處理媒體資料結果的精确性。

  第四層中的指令是“優化指令”,一共有四條指令,分别是HADDPS,HSUBPS,HADDPD,HSUBPD,它們可以對程式起到自動優化的作用。這些指令對處理3D圖形相當有用。

  第五層中的指令是“超線程性能增強”,一共有兩條針對線程處理的指令:MONITOR, MWAIT,這有助于增加Intel超線程的處理能力、大大簡化了超線程的資料處理過程。

  從技術上來看,SSE3對于SEE2的改進非常有限,是以它為Prescott所帶來的性能提升相當有限,它的優勢仍展現在視訊解碼方面—Intel宣稱如果在資料編碼算法使用LDDQU指令,那麼影象壓縮速度可以提升10%左右。在當時來看,SSE3仍屬于最先進的指令集,是以AMD、全美達後來也在它的處理器中加入對SSE3指令集的支援。

代表之作:基于Prescott核心的Pentium 4

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

四、SSE4指令集

  SSE4指令集是Conroe架構所引入的新指令集。這項原本計劃應用于NetBurst微架構Tejas核心處理器之上的全新技術也随着它的夭折最終沒能實作,這不能不說是個遺憾,但是SSE4指令集出現在了Conroe上又讓我們看到了希望。

  SSE4指令集共包括16條指令,不過雖然扣肉處理器推出已經有一些時日,但目前英特爾仍沒有公布SSE4指令集的具體資料。這相當令人感到納悶。也許英特爾是基于特殊的考慮,僅讓少數合作軟體廠商取得資料,隻是這種作法實在很沒有說服力就是了,天底下沒有哪家處理器廠商,希望自己新增的指令越少人用越好。

  不過,從Intel Core微架構針對SSE指令所作出的修改被稱之為“Intel Advanced Digital Media Boost”技術來看,未來SSE4将更注重針對視訊方面的優化,我們認為SSE4主要改進之處可能将針對英特爾的Clear Video高清視訊技術及UDI接口規範提供強有力的支援。這兩項技術基于965晶片組,Intel的官方把Clear Video技術定義為:支援進階解碼、擁有預處理和增強型3D處理能力。

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

  值得一提的是,在SSE4中另一個重要的改進就是提供完整128位寬的SSE執行單元,一個頻率周期内可執行一個128位SSE指令。Conroe中SSE的ADDPS(4D 32bit共128bit,單精度加法)、MULPS(4D 32bit共128bit,單精度乘法)和SSE2的ADDPD(2D 64bit共128bit,雙精度加法)、MULPD(2D 64bit共128bit,雙精度乘法),這四條重要SSE算術指令的吞吐周期都降低到1個周期,真正做到了英特爾宣稱的每個周期執行一條128位向量加法指令和一條128位向量乘法指令的能力。

  可以說 Conroe的向量單元已經全面引入了流水線化的設計。而支援SSE3的NetBurst微處理器架構雖然提供128位寬執行單元,但僅有一組,性能孰高孰低一目了然。更為重要的是,目前已經有相當多的軟體針對SSE指令集進行了優化,其中包括2D制圖、3D制圖、視訊播放、音頻播放、檔案壓縮等方面,可見其應用範圍相當廣泛。

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

  配合完整的128位SSE執行單元,以及龐大的執行單元數目,Conroe處理器可在一個頻率周期内,同時執行128位乘法、128位加法、128位資料加載與128位資料回存,或着是4個32位單倍浮點精确度乘法與4個32位單倍浮點精确度加法運算,這将使其更利于多媒體應用。是以,SSE4指令集能夠有效帶來系統性能上的提升,這一代在衆多測試中早已被證明。雖然其不會像當年SSE2指令集出現時那樣帶來巨大的性能提升,但是其在某些特殊方面的應用還是讓我們對它充滿了期待。

代表之作:Core 2 Duo處理器

從Pentium III到扣肉 SSE指令集發展曆程回顧從Pentium III到扣肉 SSE指令集發展曆程回顧

繼續閱讀