電腦 comment

[小惡魔的電腦教室] 1-3.CPU進階技術講解,XD、VT、SSE在幹嘛

person icon G.F 2007-07-25
注意:本篇文章難度較高,對CPU技術沒興趣的人可以跳過。


XD、XD,傻傻分不清楚(感謝DaPang貢獻迷糊小白鬼一隻)


除了一些「數字」規格,比如時脈、快取大小、FSB等等之外,CPU還有「文字」式的規格,這些是隨著CPU發展,逐步加入的特殊功能。它們通常和效能速度無關,卻是相當重要的特色。這裡我們抓另一個軟體CrystalCPUID來玩,它是類似CPU-Z的軟體,會列出CPU的所有規格,特殊功能的部分甚至比CPU-Z還詳細。

 

CrystalCPUID會把CPU支援的特殊功能列出來,不可能有CPU可以同時亮起所有功能,因為這些功能一些是AMD獨有,另一些是Intel獨有,大家抓回來跑跑看就知道了。


圖片下方一堆英文縮寫,如SSE、Cool n' Quiet等等,有一些是灰白的,就是CPU的進階功能列表。現在Intel和AMD兩邊的產品都有對應的功能,或許名稱不同,但功用都是一樣的,底下我們就整理成幾大類分別說明。這篇會帶到一些CPU的基本架構,如果寫錯的地方麻煩提出來,我會立即修改,不過考慮到文章難度,裡面的用字和比喻可能不太精確,高手們請見諒(比如SSE的部分,我就不打算寫register的概念)。


1.64位元(EM64T / AMD 64)

首先是前陣子被炒的很熱的64位元,2003年時AMD在Athlon 64率先加入消費端的64位元,Intel也隨後跟進,而在Merom核心的Core Duo筆記型處理器出現之後,Intel和AMD的消費端CPU終於全面64位元。但是,到底什麼是64位元?它有什麼好處?

位元精確度
電腦是以2進位的0與1做計算,1位元(bit)就是2的一次方,也就代表0和1兩種變化,2位元就是四種變化(00、01、10、11),依此類推。而隨著電腦進步,軟體計算所要求的精確度愈來愈高,因此CPU內部運算的位元數也跟著慢慢提高。32位元是很基本的,這代表一個資料的計算範圍能有四十億種變化(2的32次方),可以做非常細微變化的運算,也就是精確度相當高。

而前陣子在吵的64位元,其實並「不完全」指64位元運算精度,因為早在N年前CPU內部的浮點運算單元就已經到80位元,而後面會講到的SSE則是128位元。要講64位元,先從CPU內部的運算單元講起。

粗略的分,CPU內部分成「整數」和「浮點數」兩種運算單元,因為運算要求不同,所以一直都是分離的狀態。整數就是1、2、3、4、5,浮點數就是1.03、2.75781、3.668744這種有小數點的。就算大家的數學都跟我一樣爛,也看的出來浮點數需要比較高的精確度來表達小數點後面的數字,如果精確度不夠,就代表小數點之後某幾位得被截斷,現實使用就可能某個程式會出錯,因此CPU在20幾年前就導入80位元的浮點運算精確度。

64位元定址
整數這邊就沒這麼要求了,但整數運算單元還得另外負責「記憶體定址」,也就是記錄某個資料是放在記憶體哪邊。32位元的整數單元同時代表「32位元的整數精確度」和「32位元的記憶體定址」。問題出在後面那個,因為它直接影響CPU所能「看到」的記憶體容量,2的32次方是40億個位址,也就是4GB的容量。就算記憶體裝超過4GB,32位元的CPU也只能看到4GB,因為它就只能定址到那麼多。

這問題在20年前無關緊要,那時大家還在慢慢熬4MB、8MB的記憶體,但時代進步之後,這問題愈來愈嚴重,首先出問題的就是伺服器,因為他們需要大量的記憶體來輔助CPU運算,所以歷史上前幾個支援64位元的CPU通通出在伺服器上。而AMD在Athlon 64之後把64位元帶向消費市場,稱為AMD64,隔一年的2004年,Intel也做出回應,在Pentium4中開始加入EM64T。2007年現在,市場上每一顆CPU都已經支援64位元,除非去二手市場找古董。

64位元之後,記憶體支援的容量「理論上」就高達「170億GB」,這應該足以用到人類殖民織女星,建立銀河帝國。現階段,64位元需要搭配作業系統,由於實在裝不了那麼多,所以硬體和作業系統都會加入人為的限制。硬體方面,EM64T和AMD64都只支援到40位元的記憶體定址,也就是1TB(1024GB)的記憶體;軟體上,Windows XP、Linux和Mac OS X的64位元分別支援到128GB、64GB和16GB,Windows Vista的64位元,依版本不同支援從8GB到128GB不等。


Windows XP的64位元版,剛出來時大家都嘗鮮灌來玩,結果發現沒什麼差,軟體和驅動程式反而更難找。


64位元作業系統支援的記憶體容量
Linux64GB
Mac OS X16GB
Windows XP Professional x64 Edition128GB
Windows Vista Home Basic8GB
Windows Vista Home Premium16GB
Windows Vista Business128GB
Windows Vista Enterprise128GB
Windows Vista Ultimate128GB



32還是64?
由於現在幾乎已經快買不到「非64位元」的CPU,所以這問題其實是「要不要灌64位元的作業系統」?其實看你的用途,如果你要處理的檔案常常超過4GB,比如超高解析度的圖檔或超大的影片,預算也夠買4GB以上記憶體的話,那就裝64位元吧!但要確定所用的軟體也支援64位元,雖然64位元的作業系統也能跑32位元程式,但舊程式一樣只能用4GB以內的記憶體。現在64位元的軟體慢慢變多了,記憶體也不定期崩盤一次,總有一天,大家一定都是64位元,隨便一台上網機都可能裝4GB的記憶體。。

註:常有人問,為什麼裝了4GB的RAM,Windows XP只能看到3.8GB?消失的200MB是被Windows幹走給系統底層用了,剩下的才給使用者,換裝到64位元版本就沒這個問題了。


2.多媒體指令集(MMX SSE SSE2 SSE3 SSSE3 MMX+ 3DNow!)


標題裡的縮寫你可能認得一兩個,尤其MMX在Pentium時代被宣傳到爛掉,好像加了MMX之後,程式就加快數百倍,使用者腦袋變清楚,考試都考100分....。呃,總之,標題裡的一堆縮寫雖然不同,但它們想要做的事情幾乎完全一樣,只是隨著時代一直進步,愈做愈厲害,但未來有一天,這些東西或許都不重要了。

SIMD的概念
前面有說,電腦運算是二進位的方式,32位元代表CPU的運算單元可以抓「一個」32位元的資料,做32位元精確度的計算。問題在於「一次都只能一個」,有些資料型態天生則是「一組」。比如圖片好了,大家應該知道電腦的顏色是由紅綠藍RGB三原色組成,所以圖片裡每個點至少就有RGB三個資料。當CPU在處理這種資料時,還是只能拆成一個一個來,而不能一組一組來。由於這種資料型態在多媒體世界中很常見,因此Intel在Pentium首度加入MMX,也就是大家誏誏上口的「多媒體指令集」。

MMX支援到64位元,但並非只支援單一64位元的資料,它也可以同時運算2個32位元或4個16位元的資料,很適合「一組資料做同一種運算」。比如圖片中的某一點做影像強化,就是單一種指令,運算在整組的RGB三個資料上,這就是SIMD(Single Instruction Multiple Data,單一指令多重資料)的概念,而MMX就是最初的SIMD指令集,用了之後,CPU的多媒體能力就加強了呢!

SSE1~SSE4
AMD看到Intel把MMX捧上天去,就自己在K6 CPU裡弄了3DNow!,MMX只支援整數運算,3DNow!就加入浮點運算,但兩者都一樣是SIMD,同樣鎖定多媒體應用。Intel看到3DNow!又不爽,做出SSE(Streaming SIMD Extensions)支援浮點運算,並拓寬資料支援度到128位元,AMD終於放棄,轉而支援SSE。之後SSE開始自己改版,每一代都增加精確度,並加入更多指令,最新即將出現的是SSE4,只有尚未上市的AMD Barcelona和Intel Penryn才有支援。

現在SSE3已經相當普及,CPU幾乎全數支援,各種多媒體軟體如Photoshop、Winamp、xvid影片解碼器等等也都支援SSE3了。但未來會如何?我個人覺得這種SIMD指令集的應用會逐漸轉到顯示卡上,因為再快的CPU做多媒體運算,都還不如一張中階的顯示卡。事實上,開發出3DNow!的人都跑去NVIDIA了,這部分我們到顯示卡的章節再仔細討論。


3.省電技術(SpeedStep/EIST、PowerNow!/Cool n' Quiet)

如果有空的話,不妨用「工作管理員」觀察一下你整天用電腦的CPU佔用率,看真正跑到100%有幾次。通常只有玩遊戲、影片/圖片處理、壓縮檔案有可能會到100%,瀏覽網頁、MSN、聽音樂、文書處理要讓CPU超過50%都蠻難(就算全部一起做)。如果CPU在沒事幹的時候還以最高速度運作,就等於「白花油」了,不僅CPU耗電也產生更多廢熱,間接得讓CPU風扇轉更快來散熱,讓整機耗電量上升。現在油價這麼貴,浪費電是不環保的....(好像沒什麼關係?:p)

所以Intel在Pentium III、AMD在K6-2之後,分別導入類似的省電機制,也就是SpeedStepPowerNow!,原理也很相似,就是在CPU沒事幹的時候,降低CPU時脈和電壓來省電,如果CPU工作量提高,就立即拉高時脈來應付。到最新的Intel EIST(Enhanced Intel SpeedStep Technology)和AMD Cool n' Quiet都還是基於相同的降頻基礎來省電,只是加入一些新招式。

降倍頻來省電
EIST能把CPU的倍頻降到最低6倍頻,無論它原本是跑多少倍頻,比如Core 2 Duo E4300原本是跑200 x 9 = 1.8GHz,沒事時就會降到200 x 6 = 1.2GHz。所以愈高階、倍頻數愈大的CPU,愈能省更多電,當然這些高階怪獸全速跑起來吃超兇的;EIST另外加入關閉電晶體的功能,Intel雙核心是共用一塊L2快取,在工作量不高的時候,會關閉沒用到的快取來省電。Windows XP已經內建SpeedStep的功能,不用什麼設定就會自己啟動。

Cool n' Quiet可讓CPU的倍頻最低降到5倍頻,除此之外也會依時脈來調整風扇轉速,所以稱為「冷又安靜」,降低風扇轉速能同時有靜音和省電的效果。可惜Cool n' Quiet沒有內建在Windows裡,得另外裝Athlon 64/FX的Driver,再到XP「控制台」裡的「電源選項」,調到「最小電源管理」才行。不過我之前用Athlon 64的時候覺得這樣實在很麻煩,都是常駐另一個程式RMClock來調整。



RMClock是很好用的電壓調整軟體,不用灌什麼Driver就支援Athlon 64系列,當然也支援Intel的CPU。


4.防毒(XD/NX)

顏文字出現了.....

CPU使用記憶體只做為兩種用途,一是儲存資料,二是儲存程式的指令,而XD或NX技術就讓這兩種用途完全隔離,放程式的地方不能儲存資料,反之亦然,放資料的地方不能儲存程式。

在沒有XD或NX技術時,放資料的地方可以同時放程式,這會產生一個很大的漏洞,病毒可以把自己偽裝成資料,然後在原本放資料的地方啟動,寫爆資料區塊,把其他程式的資料通通蓋掉,造成系統當機,就是好幾年前很出名的「緩衝區溢位」(Buffer Overflow)攻擊,如果大家還有印象的話,2001年的「紅色警戒」(Code Red)蠕蟲就是這種攻擊的代表。

這之後大家就學到教訓了,Intel在消費端CPU加入...呃...XD技術(eXecute Disable,執行關閉),AMD也加入完全一樣,但名稱不同的NX(No eXecute,不淮執行)技術,防毒的方式很簡單,就是在儲存資料的區塊不能執行程式。這需要作業系統搭配,Windows XP以Service Pack 2更新的方式加入這功能,稱為「資料防止制行」(DEP),只要CPU支援XD或NX,這功能就會自動啟動。



Windows XP在Service Pack 2之後就多了這個DEP防毒功能,這選項在「我的電腦」按右鍵選「內容>進階>設定(效能部分)>資料防止執行」下面。


5.虛擬化(VT/AMD-V)

最後,也是最難最複雜的「虛擬化」技術,這東西真的虛無縹緲到極點,即使導入虛擬化技術的CPU已經蠻多了,相對應的軟體也已經齊備,但可能是不容易使用,所以只有在伺服器的世界裡比較常見。

用最簡單的解釋,虛擬化可讓一顆CPU「同時」跑多個作業系統,而且都能「直接存取」硬體。現在個人電腦在一般情況下都處於效能過剩的狀態,如果有虛擬化技術,就可以分割成兩個作業系統,一個拿來上網或文書處理,另一個拿來做多媒體中心,兩個互不干擾,其中一個當機不會影響另一個;或甚至同時跑Windows和Linux兩種作業系統。

厲害了吧!怎麼弄的?

特權等級
這要從CPU的「特權等級」講起,為了保護系統穩定不當機,現在作業系統和x86 CPU分成四個等級,稱為Ring 0、1、2、3,作業系統的每個部分分別存在於不同的等級,數字愈大,權力就愈小,但愈接近使用者。這是避免一般程式直接存取到硬體,影響穩定度,比如說,Windows XP下遊戲不能直接存取顯示卡,得透過驅動程式才行,因為遊戲或一般程式都是在最高的Ring 3,而驅動程式在Ring 0,中間得經過特別並保護過的方式來溝通,只有Ring 0才能存取硬體,至於Ring 1和Ring 2則是給作業系統的底層服務用的。

所以,如果要同時跑兩個作業就有點麻煩了,有玩過VMWare、VirtualPC或類似軟體的人大概知道,你可以在這些軟體裡跑多個作業系統,但得先裝它的特殊驅動程式,這些特殊的「虛擬」驅動程式是用來讓虛擬的作業系統存取,並和真實的裝置連接(比如虛擬網路卡和真實網路卡做橋接,分享網路資源),同時把虛擬作業系統的所有指令即時轉換到真實作業系統。之所以這麼麻煩,就是因為這些虛擬PC的軟體都是在Ring 3,裡面的虛擬作業系統不能直接存取真實硬體。

在這些軟體裡灌作業系統,看到的硬體絕對不會跟外面真實的硬體一樣。

Ring -1
無論是虛擬驅動程式或即時轉換,都會耗掉CPU的資源,而且無法發揮硬體的真實能力,所以Intel和AMD分別加入VT和AMD-V虛擬化技術,如果你看的懂上面那段,那下面這段話也就不難理解,這些虛擬化技術就是創造一個全新的特權等級,相當於Ring -1(負1),比Ring 0更底層。

只要在Ring -1等級架一個軟體,然後作業系統灌在這個軟體上,這些作業系統就會都擁有Ring 0的等級,每一個作業系統看到的都是真實硬體,都能發揮100%的硬體能力,同時又不會互相干擾。

至於怎麼把軟體灌在Ring -1,說真的我也不知道,灌完要怎麼切換作業系統我也沒看過。我只知道XenVMWare都已經支援VT和AMD-V,但沒有試過,希望有高手能出來解答一下,讓所有人大開眼界。



虛擬化技術是新增一個「Ring -1」的層級,夾在傳統Ring 0和硬體之間,讓多個作業系統都有Ring 0控制硬體的權限。



Xen是第一個支援CPU虛擬化技術的軟體,不過圖中並非跑虛擬化技術的樣子,而是一般的「部分虛擬化」模樣,透過虛擬驅動程式和指令轉換。


結語

這篇是整個CPU章節裡最難的部分了,接下來就是簡單評論Intel和AMD兩邊陣營的CPU有什麼差異,小罵一下腳位和規格有多麼混亂,都是一些資料整理而已。如果你看完這篇有什麼不懂,或覺得我有寫錯的地方,歡迎提出來大家一起討論。其實,30年的CPU發展根本不可能在短短三篇裡講完,近代x86 CPU真正的菁華是在內部架構的設計上,那根本就是世界奇觀,也是為什麼Intel Core 2 Duo能反攻AMD Athlon 64的原因,並非規格數字比較強,時脈也沒比較高,支援的特色大家都差不多,但Core 2就硬是比較快,而且還快一大截。這方面的CPU架構解說會更複雜,我就不納入了,有機會的話再另外補完吧。
前往