早期計算機提速的方式是 減少晶體管的切換時間。
晶體管組成了邏輯門娜遵,ALU 以及前幾篇的其他組件蜕衡,但這種提速方法最終會碰到瓶頸。
所以芯片廠商發(fā)明各種新技術來提升性能设拟,不但讓簡單的指令運行的更快慨仿,也讓它能進行更復雜的運算。
上次設計了除法程序纳胧,如16 /4 實際 16 -4 -4 -4 -4 直到遇到0 或負數才停下镰吆。
但這種方法要多個時鐘周期,很低效跑慕。
所以現代 CPU 直接在硬件層面設計了除法万皿,可以直接給ALU 除法指令。
這讓ALU 更大也更復雜一些核行,但也更厲害牢硅。
復雜度 vs 速度 的平衡在計算機發(fā)展史上經常出現。
現代處理有專門電路來處理芝雪,圖形操作减余、解碼壓縮視頻、加密文檔等等
要用標準操作來實現惩系,要很多個時鐘周期位岔。
可能聽過處理器有 MMX 3DNOW SSE 如筛,他們有額外電路做更復雜的操作。
用于游戲和加密等場景。
指令不斷增加,人們一旦習慣了它的便利就很難刪掉诫龙,為了兼容舊的指令集渔肩,指令數數量越來越多。
Intel 4004 第一個集成CPU 有 46 條指令,足夠做一臺能用的計算機,現代計算機有上千條指令,有各種各樣巧妙復雜的電路做粤。
超高的時鐘速度帶來另一個問題
如何 快速傳遞數據給CPU ,就像有強大的蒸汽機捉撮,但無法快速加煤怕品。
RAM 成了瓶頸 。
RAM 是CPU 之外的獨立組件巾遭。
意味著數據要用線來傳遞肉康,叫 “總線”。
總線可能只有幾厘米灼舍。
電信號的傳輸接近光速吼和,但CPU每秒可以處理上億條指令,很小的延遲也會造成問題骑素。
RAM 需要時間找地址炫乓,取數據,配置献丑,輸出數據末捣。
一條 “從內存讀數據” 的指令可能要多個時鐘周期。
CPU 空等數據创橄。
緩存
解決延遲的方法是 給CPU 加一點RAM - 叫 “緩存”箩做。
處理器空間不大,所以緩存一般只有kb MB 妥畏,而RAM 都是GB 起步邦邦。
CPU 從RAM 拿數據時 RAM 不用傳一個,可以傳 一批醉蚁。當處理器需要下一個交易額時候就直接從緩存取數
如計算餐館每日應收燃辖,從地址100 取數,可以取一批网棍,存在cache中
雖然花的時間久一點郭赐,但數據可以存在緩存里面。
這很實用确沸,因為數據常常是一個個按順序處理捌锭。
因為緩存里CPU 近 ,一個時鐘周期就能給數據罗捎,CPU 不用空等观谦。
比反復去RAM 拿數據塊的多。
如果想要的數據已經存在緩存桨菜,叫 緩存命中豁状。不在 叫 緩存未命中。
緩存也可以當臨時空間倒得,存一些中間值泻红,適合長/復雜的運算。
繼續(xù)餐館的例子霞掺,假如計算完所有數據谊路,想把結果存到地址150 ,數據不是直接存RAM 而是存入緩存菩彬,這樣不但存起來快缠劝,如果接著計算取值葉快一些。
這樣帶來了一個有趣的問題骗灶,緩存和RAM 不一致了惨恭。
這種不一致要記錄,之后要同步耙旦。
因此緩存的每個空間有個特殊標記-叫“臟 位(dirty bit)”
同步一般發(fā)生在當緩存滿了 而CPU 又要緩存時候脱羡。
在清理緩存騰出空間之前,會先檢查 “臟位”
如果是“臟 ” 的 在加載新的內容之前匯編數據寫回 RAM 免都。
指令流水線
另一種提升性能的方法叫 指令流水線锉罐。
想象下你要洗整個酒店的床單,但只有一個洗衣機 一個 干燥機琴昆。
選擇1 : 按順序來氓鄙,放洗衣機 等30 分鐘洗完,再放進干燥機 30分鐘烘干业舍。 一
小時洗一批選擇2 :并行處理 進一步提高效率
在洗衣機洗完的同時抖拦,放入烘干機,再放一批到洗衣機同時洗舷暮。
處理器也可以這樣設計态罪。
之前演示了CPU 按序處理: fetch - decode - execute
取址- 解碼- 執(zhí)行 不斷重復。
這種設計三個時鐘周期執(zhí)行一條指令下面,每個階段用的CPU的不同部分复颈,意味著可以并行處理。
“執(zhí)行” 一個指令時沥割,同時解碼下一個指令耗啦≡淦校“讀取” 下下個指令。
不同任務重疊進行帜讲,同時用上CPU 里所有的部分衅谷。
這樣的流水線 每個時鐘周期執(zhí)行一個指令,吞吐量 x 3
和緩存一樣會帶來一些問題似将。
- 指令直接的 依賴關系
你在讀取某個數據获黔,而正在執(zhí)行的指令會改這個數據,也就是拿了的舊的數據了在验。
因此流水線處理器玷氏,要先弄清數據依賴性。
必要時停止流水線腋舌,避免出問題盏触。
高端CPU 筆記本或手機,會更近一步 動態(tài)排序 有依賴關系的指令侦厚,最小化流水線的停工時間--叫 “ 亂序執(zhí)行” 耻陕。
這種電路非常復雜。因為非常高效刨沦,幾乎所有現代處理器都有流水線操作诗宣。
- 條件跳轉
如之前的 jump negative ,這些會改變程序的執(zhí)行流想诅,簡單的流水線處理器召庞,看到jump 指令會停一會,等待條件值確定下來来破。一旦jump的結果出了 處理器就繼續(xù)流水線篮灼。
一位空等,會造成延遲徘禁,所以高度處理器會用一些技巧诅诱,
可以吧jump 想成岔路口, 高度CPU 會猜那條路可能性大一些送朱。然后提前把指令放進流水線娘荡,這個叫--“推測執(zhí)行”
當JUMP 的結果出了,如果CPU 猜對了驶沼,流水線已經塞滿正確的指令炮沐,可以馬上運行。
如果猜錯回怜,就要清空流水線大年。就像走錯路掉頭。
為了盡可能減少清空流水線的次數,CPU 廠商開發(fā)了復雜的方法翔试。
來猜測那條分支更有可能轻要,叫分支預測
現代計算機正確率超過90%
理想情況下 流水線一個時鐘周期完成一個指令。
然后“超標量處理器” 出現了遏餐,一個時鐘周期伦腐,完成多個指令
- 即便 有流水線設計,在指令執(zhí)行階段失都,處理器里有些區(qū)域還是可能會空閑,
比如幸冻,執(zhí)行一個 “從內存取值” 指令期間粹庞。 ALU 會閑置。
所以洽损,一次性處理多條指令庞溜,(取指令+解碼) 會更好。
如果 多條指令 要CPU 的不同部分碑定,就多條同時執(zhí)行流码。
可以在進一步,加多個相同的電路延刘,執(zhí)行出行頻次很高的指令漫试,
舉例:很多CPU 有四個 八個 甚至更多完全相同的ALU ,可以同時執(zhí)行多個數學運算碘赖。
以上的方法驾荣,都是優(yōu)化1個指令流的吞吐量。
多核處理器
同時運行多個指令流--多核處理器普泡。
雙核 四核處理器播掷。
一個CPU 芯片里面有多個獨立處理單元。
很像有多個獨立CPU 撼班,但因為他們整合緊密 可以共享一些資源歧匈。
比如 緩存,使得多核可以合作運算砰嘁。
但多核不夠時件炉,可以用多個CPU。
高端計算機般码,比如現在的YouTube 服務器妻率,需要更多馬力,讓上百人能同時流暢的觀看板祝。2個或者4個CPU 是常見的宫静。
但有時候人們又更高的性能要求。所以造了超級計算機。
比如需要模擬宇宙的形成 需要強大的計算能力孤里。
給普通臺式機加幾個CPU 沒什么用伏伯。
需要很多處理器。
截止現在世界上對快的計算機在捌袜,中國無錫國家超算中心说搅。
神威 太湖 有40960 個cpu 每個cpu 有256 核心。
總超過 1千萬核心虏等,每個核心頻率 1.45Ghz
每秒可以進行 9.3億次的浮點數運算弄唧。
每秒浮點數運算次數 flops,速度很可怕霍衫。
處理器速度更快候引,也變得更復雜,用各種技巧敦跌。
榨干 每個時鐘周期 澄干,做更可能多運算。
我們的任務是利用這些運算能力柠傍,做有酷又使用的事麸俘。
編程就是為了這個,下次說惧笛。