硬體影響軟體,軟體又如何利用硬體?

曾經遇到一個問題,兩個晶片,同樣的Cortex-A53,同樣的匯流排,同樣的頻率,同樣的快取和記憶體大小,跑同樣的記憶體測試,效能差了40%。而經過最佳化之後,反超了20%。想搞清楚為什麼,就需要知道,訪存路徑上有哪些影響因素?
系統瓶頸可能有哪些地方?效能最佳化可以怎麼做?等等。最近,這些問題終於有了答案,我把它們寫下來,給我自己一個總結,也給有同樣困惑的人一個解釋。
文章會很長,我想從CPU怎樣訪問記憶體這樣一個既簡單也複雜的問題入手,自問自答,並逐步引入更多的疑問和答案,最終把訪存通路上每一個環節的硬體結構,特徵,效能分析以及未來的發展趨勢都加進去。很多概念,像快取,同步,一致性,壁壘,鎖等,並不複雜,可是他們是怎麼在ARM
SoC中實現的,效率又如何,我覺得還是有必要搞清楚。最後,我會重新分析文章開頭的問題。這些知識並不是在重複一個處理器或者SoC的結構,而是分析硬體會怎樣影響軟體,軟體如何利用硬體並且,我是程式設計師,從來沒有做過晶片設計,所有的知識都是從程式設計師的角度出發的,所以軟體工程師們應該能看懂。
在開始之前,先說些輕鬆的話題。
晶片廠商向客戶介紹產品,從硬體角度說的最多的就是功能,效能,功耗和價格。功能這個主要就是看晶片提供了什麼介面,比如快閃記憶體,記憶體,PCIe,USB,SATA,乙太網等,還看內部有什麼運算模組,比如浮點器件,解碼器,加解密,圖形加速器,網路加速器等等。效能,對CPU來說就是的測試程式能跑多少分,比如Dhrystone,Coremark,SPEC2000/2006等等。針對不同的應用,比如手機,還會看圖形處理器的跑分;
又比如網路,還會看包轉發率。當然,客戶還會跑自己的一些典型應用程式,來得到更準確的效能評估。功耗就是在跑某個程式的時候,整個晶片的功率是多少瓦。通常,這時候處理器會跑在最高頻率,但這並不意味著所有的電晶體都在工作,由於power
gating和clock
gating的存在,那些沒有被用到的邏輯和片上記憶體塊並沒在完全耗電。我看到的晶片公司給出的處理器最大功耗,通常都是在跑Dhrystone。
這個程式有個特點,它只在一級快取之上執行,不會訪問二級快取,不會訪問記憶體。這樣得出的其實並不是真正的最大功耗。但是從實際經驗看,沒有應用程式能讓CPU消耗更高的能量,所以這麼測量最大功耗也沒什麼錯。當然,作為整體的晶片功耗,還得包括各種加速器和介面,尤其是會被用到的模組。
晶片公司宣傳產品的時候,會有各種各樣的玄機在裡面,任何一家都會把好看的資料放上來。這些資料大都是真實的,可是怎麼擺這些資料是一門技術活,擺的好能誤導不少觀眾,而x86,ARM,MIPS,PowerPC,
ARC陣營的各家產品經理和市場人員都是這方面的好手。我會在深入介紹之後專門列一章說這些竅門。
在設計SoC的時候,效能,功耗和價格就轉換成了PPA。啥是PPA?其實就是效能,功耗和麵積。
其中,效能有兩層含義。在前端設計上,它指的是每赫茲能夠跑多少標準測試程式分。設計處理器的時候,會有個多少級流水線的說法。通常來說,流水線級數越多,晶片能跑到的最高頻率越高,這個大家應該都知道。可是並不是頻率越高,效能就越高。這和處理器構架有很大關係。典型的反例就是Intel的奔騰4,30多級流水,最高頻率高達3G赫茲,可是由於流水線太長,一旦指令預測錯誤,重新抓取的指令要重走這幾十級流水線,代價是很大的。而它的指令預測又極大依賴於編譯器來最佳化,結果當時編譯器又沒跟上,導致它總體效能低下。
你看MIPS或者PowerPC的處理器頻率都不高,但是每赫茲效能相對來說還不錯,總體效能就會提高一些。所以看效能要看總體跑分,而不是每赫茲跑分。前一段時間龍芯在宣傳的時候就鑽了這個空子,號稱每赫茲都趕上至強了,但是也就能跑個1Ghz多,而16核至強可以到將近3Ghz。
效能的另外一個含義就是指頻率,這是從後端設計角度來說的。通常後端的人並不關心每赫茲能達到多少跑分,他們只看晶片能跑到多少頻率。頻率越高,在每赫茲跑分一定的情況下,總體效能就越高。
請注意對於那些跑在一級快取的程式,處理器每赫茲跑分不會隨著頻率的變化而變化。當然如果考慮到多級快取,匯流排和外圍介面,那肯定就不是隨頻率線性增加了。系統級的效能問題,我會在以後慢慢展開。
那哪些因素會影響頻率?就算只從後端角度考慮,答案也很多。我並不是做後端和製程的,只能把道聽途說的寫下來,僅供參考。
首先,受工藝的影響。現在先進的半導體工廠就那麼幾家,Intel,臺積電,三星,聯電,格羅方德。拿臺積電來說,它目前提供16奈米的工藝,其中還分了很多小結點,比如FFLL++和FFC。每個小節點各有特點,有些能跑到更高頻率,有些功耗低,有些成本低。在不同的工藝上,晶片能跑的最高頻率不同,功耗和麵積也不同。
其次,受後端庫的影響。臺積電會把工藝中電晶體的引數抽象出來,做成一個物理層開發包PDK,提供給eda工具廠商,IP廠商和晶片廠商。而這些廠商的後端工程師,就會拿著這個物理層開發包,做自己的物理庫。物理庫一般包含邏輯和memory兩大塊。根據電晶體的channel

length,會有不同特性,適合於不同的用途的單元cell。而怎麼把這些不同特性的庫裡的cell,合理的用到不同的前端設計模組,就是一門大學問。

一般來說,channel

length越短,電子漂移距離越短,能跑的頻率就越高。可是,頻率越高,功耗就越大,並且是指數上升。除了cell之外,還會有9T/12T這種說法,這裡的T是Track,就是cell的高度。T越大,電流越大,越容易做到高頻,相應的面積也越大。

接下來,受佈局和佈線的影響。晶片裡面和主機板一樣,也是需要佈線的。每一層都有個利用率的說法,總體面積越小,利用率越高,可是佈線就越困難。在給出一些初始和限制條件後,EDA軟體會自己去不停的計算,最後給出一個可行的頻率和麵積。
再次,受前後端協同設計的影響。比如,某個訪問memory的操作,如果知道處理器會花多少時間,用哪些資源,就可以讓memory的空閒塊關閉,從而達到省電的目的。這種技巧可能有上千處,不自己設計處理器是沒法知道的,哪怕你有RTL程式碼。
再往上,就是動態電壓頻率縮放DVFS。這裡需要引入功耗的組成概念晶片功耗分成動態和靜態兩部分,靜態就是電晶體漏電造成的,大小和晶片工藝,電晶體數,電壓相關,而動態是開關切換造成的,所以和電晶體數,頻率,電壓相關。具體公式我就不列出了,網上有。控制動態功耗的方法是clock
gating,頻率變小,自然動態功耗就小。控制靜態功耗的方法是power
gating,關掉電源,那麼靜態和動態功耗都沒了。
還可以降低電壓,那麼動態功耗和靜態功耗自然都小。可是電壓不能無限降低,否則電子沒法漂移,電晶體就不工作了。並且,電晶體跑在不同的頻率,所需要的電壓是不一樣的,拿16nm來說,往下可以從0.9V變成0.72V,往上可以變成1V或者更高。別小看了這一點點的電壓變化,要知道,動態功耗的變化,是和電壓成三次方關係的。1V和0.7V,電壓差了50%,動態功耗可以差3.4倍。
我看到過的資料,在500Mhz以下,處理器的動態功耗是小於靜態功耗的,變成3GHz的時候,遠高於靜態功耗。
再往上,就是軟體電源管理,控制功耗了。晶片設計者把每個大模組的clock
gating和power
gating進行組合,形成不同的休眠狀態,軟體可以根據溫度和執行的任務,動態的告訴處理器每個模組進入不同的休眠狀態,從而在任務不忙的時候降低功耗。這又是一個很大的話題,以後再展開。
從上面我們可以看到,功耗和效能其實是和在一起的。而晶片設計者可以用不同的工藝和物理庫,設計出最高可執行頻率,然後軟體控制晶片動態執行頻率和功耗。
那面積呢?其實也是相輔相成的。由於針對不同的邏輯,memory和佈線,選用了不同的物理庫cell,不同的track,形成的芯片面積也會不一樣。
通常來說,越是需要跑高頻的晶片,所需的面積越大。頻率差一倍,面積可能有百分之幾十的差別。可別小看這百分之幾十,對電晶體來說,面積就是成本,晶圓的總面積一定,價錢一定,那單顆晶片的面積越小,成本越低,並且此時良率也越高。
晶片成本除了製造費,還來自於授權費,工具費,流片費,運營開銷等,通常手機處理器這樣複雜的晶片,沒有上千萬美元是不可能做出來的。就算做出來,沒有賣掉幾百萬片,那是肯定虧的。
最後還想提下ARM的大小核設計。其最初的目的是想設計兩組核,小核每赫茲效能低,面積小,跑在低頻;大核每赫茲效能高,面積大,跑在高頻。
執行簡單任務,大核關閉,小核在低頻,動態功耗低,靜態功耗佔上風,並且由於面積小,總體功耗更低。而大核用高頻運行復雜任務。
和x86的單純調節電壓頻率比,增加了一點低頻小核面積,和整個晶片的面積比,其實沒多多少。
那為什麼不讓小核跑在高頻運行復雜任務呢?理論上,由於每赫茲效能低,對於相同的任務,小核必須跑在比大核更高的頻率才能完成,這就意味著更高的電壓。此時,動態功耗佔上風,並且和電壓成三次方關係。最終的功耗會高出大核不少。此外,我們前面已經解釋過,小核要跑在高頻,面積會增大不少,可能比大核還要大。
我們從裡面可以看到存在一個平衡點。這個平衡點並不好找。拿A53/A57在28nm上舉例,當它們跑在1.2Ghz的時候,功耗可能差兩倍,效能卻只差50%。而平衡點可能要達到2.5Ghz。
事實上,很多手機晶片的大小核都是使用同樣的處理器,跑在不同高低頻率。
所以,設計晶片很大程度上就是在平衡。影響因素,或者說坑,來自於方方面面,IP提供商,工廠,市場定義,工程團隊。水很深,坑很大,沒有完美的晶片,只有完美的平衡。
封面圖
宣告:
本文轉載自最後一個bug。如涉及作品內容、版權和其它問題,請聯絡刪除!

相關文章