指令集的進步——MMX和SSE (轉)
指令集的進步——MMX和SSE (轉)[@more@]
指令集的進步——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以上的系統更會“遍地開花”。
飛意軟體工作室-程式設計師網站版權所有
資料整理·/" 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CPU指令集SSE、AVX等
- SSE影像演算法優化系列十八:三次卷積插值的進一步SSE優化。演算法優化卷積
- [xlswriter 優化實戰] 使用 CPU SSE2 指令集加速字元查詢優化字元
- [快速閱讀六] 統計記憶體資料中二進位制1的個數(SSE指令集最佳化版).記憶體
- 【軟體硬體】精簡指令集和複雜指令集的區別
- go sseGo
- gofiber sseGo
- 使用 Go、SSE 和 htmx 實時更新網站Go網站
- IOT2050基本使用和指令集
- 左轉進步右轉煩惱-AI智慧助你玩轉電銷崗位AI
- 進一步改進GPT和BERT:使用Transformer的語言模型GPTORM模型
- 《使命召喚:現代戰爭》的進步和反思
- GPT-3,深度學習和NLP的巨大進步GPT深度學習
- C語言轉寫成MIPS指令集彙編以及MIPS指令集彙編中函式呼叫時棧的變化C語言函式
- CISC(複雜指令集)與RISC(精簡指令集)的區別
- 事倍功半是蠢蛋2(SSE)
- javap 指令集Java
- 步進電機和伺服電機區別
- 使用PHP建立一個SSEPHP
- 雙向通訊之SSE
- 步進電機的調速
- 指令集彙總
- 指令集結構
- 時代在進步,我們也要跟著進步
- C66x指令集(一)——指令集架構初探索架構
- 無限進步
- 使用@ResponseBody物件轉json和@RequestBody進行json轉物件案例物件JSON
- [顏色進位制轉換]js實現rgb和hex的相互轉換JS
- 實時訊息推送方案-SSE
- 亞信安慧AntDB的進步之路
- 進位制之間的轉換之“十六進位制 轉 十進位制 轉 二進位制 方案”
- SSE影像演算法優化系列三十一:Base64編碼和解碼演算法的指令集優化(C#自帶函式的3到4倍速度)。演算法優化C#函式
- 使用Halcon軟體和圓形標定板進行相機標定的步驟和教程
- 進一步向左轉移安全性:DevSecOps是否將變成SecDevOps?dev
- 我太想進步了
- 【每日進步】September 2012
- 計算機指令集的相關概念計算機
- 一文了解進位制之間的原理和轉換
- K-Means聚類分析以及誤差平方和SSE(Python實現)聚類Python