瀏覽單個文章
chaotommy
Elite Member
 

加入日期: Mar 2003
您的住址: Vancouver, Canada
文章: 15,006
引用:
作者samsung
請看別人寫的文章

很多大大認為100% cpu佔用就是cpu所有單元都在忙了,發揮最大效率了,實際上,100% 的cpu佔用,只說明進程把這個cpu給霸滿了,但CPU到底忙不忙,那是另外一回事。其實在99.999%的情況下,100%佔用的cpu,都是將近一半的時間在等待,剩下一半的工作時間最多也只能用到2/3的運算單元,也就是說,即使是100% 的cpu佔用,cpu其實最多也只有發揮了30%-40%的能力

那為什麼會這樣呢?

第一大CPU不能發揮的原因,就是緩衝區不命中導致的取指,數據的等待

眾所周知,CPU的速度遠遠大於內存等外設,如果沒有特別的措施,每執行一條指令,CPU都要等十幾倍的時間從內存中取指令和數據,所以我們才設計了比內存快的多得一級,二級,甚至三級緩存來加速,但相對於256M 512M 1G 2G的內存16K的一級緩存和512K 或1M的2級緩存實在是太小了,最好情況是CPU直接在1級緩存中找到數據,這樣會沒有延遲,但只有16K的一級緩存往往是找不到的,這時就要到2級緩衝中尋找並填入1級緩衝中,這就會有3-5個甚至更多個週期的延遲,如果2級緩衝還找不到,這也是常有的事,CPU就會啟動內存總線,開始緩衝區填充,把數據從內存中取回緩衝區。由於DDR,DDR2的潛伏期和相對的低頻率,這個過程要十幾二十幾個週期

CPU運行時就是這樣的受制與慢速內存,不斷的等待

第二個CPU不能發揮的原因,是IO端口的存取

CPU操作硬盤等外設時,需要通過IO端口,DMA等存取比內存還慢的多得系統總線,雖然有中斷和IO芯片的幫助,但這是比內存存取還糟10倍的情況,更糟的是在共享的總線上還常遇到衝突和總線等待的情況,對此大家用電腦時應該都有切身體會

第三個CPU不能發揮的原因,是不能充分並行和充分使用CPU執行單元

P4有5個整數單元,其中四個是雙倍的,
所以P4有9個整數單元,2個浮點單元

Athlon 有6個整數單元,3個浮點單元

(其實看這個大家就應該知道,為什麼I在媒體和商業程序超過A,A在spuer pi和一些game中超過I,CPU設計不同,沒什麼好吵的)

但A, I的CPU每時鐘週期同時執行指令數的最大理論數是3,4條,遠遠小於執行單元數,這是因為一些複雜指令和sse, 3D now指令需要不止一個執行單元,但實際上CPU執行時95%的指令都是簡單指令,於是我們就看到,絕大部分情況下,即使CPU以最大並行度運算,也只有 4,5個執行單元在執行,其他的都在閒置

況且,更重要的是,CPU並不能以他的最大理論數同時執行指令。

我們的X86指令集和X86程序本質上都是單線設計的,一週期一操作,執行完上一條在執行下一條,其實本不能在一個週期裡執行超過一條的指令,所以在現代CPU設計裡,使用了很多技巧--亂序執行(在前後指令沒有依存關係時同時執行他們),分值預測(在還沒做條件判斷是超前執行後面的指令)--等等來實現並行效果,但這些技術都是有局限的,所以雖然A, I的CPU每時鐘週期同時執行指令數的最大理論數是3,4條,但實際上平均同時只有2條左右,cpu的執行單元大部分都是空閒的。

(這個情況直接根源於x86指令架構的落後,無論是IBM PPC的SIMD結構 還是Intel IA64的甚長指令架構都是真正的並行架構,實際上,除了X86,你在現在其他CPU裡是找不到如此落後和古老的指令架構了,這是X86的輝煌還是悲哀呢)
除了以上三大原因,其他很多原因,包括操作系統進程切換,流水線清空,寄存器換名和重置等等很多原因都會造成CPU的浪費,他們雖比不上上面的三大原因,但加起來也是很大的數目

看到這裡,大家就知道HT的原理了

HT使每週期同時執行指令數的最大理論數提高了一倍,在一個進程因為取指,數據的等待,IO操作...等等等待時,另一個進程可以乘機運行,同時,在一個進程不能充分並行和充分利用所有的執行單元時,另一個進程可以可以利用剩下的單元


雞婆了一下......
舊 2005-09-04, 01:32 AM #84
回應時引用此文章
chaotommy離線中