指令集的進步——MMX和SSE (轉)

worldblog發表於2007-12-02
指令集的進步——MMX和SSE (轉)[@more@]

資料整理·/" style="COLOR: rgb(255,255,255)" target=_blank>飛意工作室-員網站


指令集的進步——MMX和SSE

  如果一次只能做一件事情……
  自最簡單的開始,指令序列便能取得運算,並對它們計算。對大多數計算機而言,這些指令同時只能執行一次計算。如需完成一些並行操作(如立體聲左、右聲道,或顯示器的紅、綠、藍混合),就要連續執行多次計算。此類計算機採用的是“單指令單資料”(SISD)。
  然而,現實世界的大多數計算都會同SISD模型衝突。比如對麥克風傳來的左、右立體聲道進行簡單過濾處理時,需將之前的幾個取樣值累加起來,再同當前值加到一起,再除以取樣次數。必須重複計算左、右聲道。下述C程式碼便是為這一目的設計的(假定取樣值儲存在left和right陣列裡,變數指向最新的取樣值,而且要求出之前三個值的平均值):
int LeftSum,RightSum;
LeftSum=(left[now-2]+left[now-1]+left[now])/3;
RightSum=(Right[now-2]+Right[now-1]+Right[now])/3;
  看來似乎頗為簡單,但在實際應用中,每次取樣都必須作同樣的計算。如決定使用CD音質,那麼每秒種都要對左、右聲道執行44100次取樣,總共便要計算88200次。為獲得LeftSum和RightSum的結果,分別要執行6條指令。所以為確保獲得連貫的CD音質,每秒鐘要執行的指令總數為:44100次取樣×2個聲道×6條指令=529000條!
  計算機顯示的道理與此相似,但情況會糟得多——想想在1024×768的解析度和24位真彩色下,假定每秒顯示30幀(雖然好但非特別出色的3D加速),僅僅為了訪問每個畫素,而不做任何實際工作,每秒便要執行70778880條指令,這顯然是個沉重的負擔。

同時做幾件事情會快得多……
  再來研究一下上述兩行C程式碼,你會發現除資料來源不同外(同樣的指令應用於兩個不同的資料流),兩者幾乎是完全一致的。設想一下,假如有這樣的一種處理器,雖然它只能執行單個指令序列,但能將那些指令同時應用於幾個獨立的資料流,速度顯然就會快上許多。我們稱之為“單指令多資料”(SIMD)處理器。
  MMX和SSE(Streaming SIMD Extensions)便是為此設計的——為傳統x86指令集增加了一系列新指令——在奔騰和奔騰Ⅱ裡叫MMX,在Pentium Ⅲ裡則叫做SSE,它們都能以SIMD方式處理資料。SSE其實就是我們早期的文章中曾提到過的KNI(Katmai New Instruction)指令,隨著PⅢ的面市,KNI便正式定名為SSE了。
  MMX指令可對整數執行SIMD運算,比如-40、0、1、469或32766等等;SSE指令則增加了對浮點數的SIMD運算能力,比如-40.2337,1.4355或877343226.012等等。利用MMX和SSE,一條指令可對2個以上的資料流執行計算。就前面的例子來說,再也不必每秒執行529000條指令了,只需執行264600條即可。因為同樣的指令可同時對左、右聲道發生作用。顯示時,每秒也不需要70778880條指令,只需23592960條,因為紅、綠、藍通道均可用相同的指令控制。
  MMX和SSE的作用還不止於此。假定顏色深淺在0到255之間變化(24位色深)。為顯示出陰暗或照明效果,在調節光線強度時,這個值完全可能低於0或超過255。如果用8位儲存,這兩種情況就分別叫做“下溢”和“上溢”。顯然,必須將值限制到0到255間,否則會產生混亂的顯示。在沒有MMX或SSE的情況下,必須在軟體裡對這種情況進行判斷與糾正。但由於在指令中使用了跳轉指令(jump),所以會明顯減慢某些處理器的速度。而在MMX或SSE問世以後,只需用範圍限制演算法執行指令即可。值會被“強制”位於正確的範圍之間,程式會流暢執行下去,感覺不出任何變化。

MMX不僅對遊戲有用……
  稍微探討一下3D遊戲,就會知道MMX為何沒有帶來遊戲效能的顯著提升,而SSE在這方面卻有卓越表現。比如玩Quake時,3D物件均由多邊形構成,而這些多邊形以一系列點的形式儲存。每個點(上接29頁)都有對應的3軸座標。如限制成只用整數,便不能精確地表示這些位置(如每個座標軸使用16位,那麼只能得到65536個座標點),造成圖形顯示非常糟糕。自奔騰開始,Intel各型處理器的浮點運算能力便非常強大,遊戲開發者幾乎都情願選用浮點運算。由於MMX不能對浮點進行操作(更糟的是,從MMX切換到浮點時,還會造成效能的瞬間劇降),所以MMX並不能將遊戲提速至比裝置程式更高的一個水準,這正是MMX令許多人失望的原因。假如你用3D加速卡做圖形渲染,遊戲中完成的運算(模擬、3D變形、照明等)會耗去約90%的處理器時間。也就是說,MMX只為處理器留出了10%的時間來做其他工作,這還是在你使用了3D卡的前提下。
  SSE有效解決了這個問題,除保持原有的MMX指令外,又新增了70條指令,在加快浮點運算的同時,也改善了的使用,使記憶體速度顯得更快一些。對遊戲效能的改善十分顯著,可以說令人震驚!想想你現在需要一個400MHz以上的處理器,才能使Voodoo2、Riva TNT或Rage 128等發揮至最高幀頻,便可清楚理解這一點。按Intel的說法,SSE對下述幾個領域的影響特別明顯:3D幾何運算及動畫處理;圖形處理(如Photoshop);影片編輯//解壓(如MPEG和);語音識別(ViaVoice仍然只是玩具,因為一般你每說20個字,它就會聽錯一個);以及聲音壓縮和合成。

將SSE引入你的
  Pentium Ⅲ(代號Katmai)已於2月底正式上市,初期只提供450和500MHz兩個版本,均採用Slot 1封裝及100MHz外頻。所以假如你用的是BX主機板,只需升級一下,便可讓PⅢ在你的系統上執行如飛。當然,前提是你的腰包足夠鼓——它們現在仍是天價。
軟體和驅動方面則不必擔心。自1999年開始,會有越來越多的SSE軟體上市,包括一些最熱門的遊戲,比如“天旋地轉3”和“Quake 3:競技場”等等。
  下個系列的Pentium Ⅲ將於今年2季度晚些時候大量上市,將支援更快的133MHz外頻(某些老主機板未提供這一頻率),從533MHz起跳。到99年末,600MHz以上的系統更會“遍地開花”。

飛意軟體工作室-程式設計師網站版權所有

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-987296/,如需轉載,請註明出處,否則將追究法律責任。

相關文章