CPU 性能瓶頸何解?

硬件優(yōu)化和經(jīng)深思熟慮的軟件架構(gòu)能起作用,但不多。

本文來自微信公眾號“半導(dǎo)體產(chǎn)業(yè)縱橫”,由半導(dǎo)體產(chǎn)業(yè)縱橫(ID:ICVIEWS)編譯自semiengineering。

硬件優(yōu)化和經(jīng)深思熟慮的軟件架構(gòu)能起作用,但不多。

640 (1).png

多核處理器理論上可以并行運行多個代碼線程,但目前某些類別的操作阻礙了通過并行計算來提高整體性能的嘗試。

是時候使用加速器來運行高度并行的代碼了嗎?標準處理器有許多CPU,因此緩存一致性和同步可能涉及數(shù)千個低級系統(tǒng)代碼周期,以保持所有內(nèi)核的協(xié)調(diào)。根據(jù)CPU寬度和數(shù)據(jù)依賴性,CPU利用指令級并行性的能力也有限。

這些CPU性能瓶頸是真實且普遍存在的,而且很難解決。盡管軟件開發(fā)人員在創(chuàng)建可并行算法方面發(fā)揮著巨大作用,但專門適合執(zhí)行并行代碼的硬件仍有發(fā)展空間。

三大瓶頸

CPU架構(gòu)師花費了無數(shù)個周期來尋找改進處理器的方法,以提高性能或降低功耗。這是不斷改進CPU的主要動機。“CPU是為運行非結(jié)構(gòu)化應(yīng)用程序代碼而設(shè)計的,”Quadric首席營銷官Steve Roddy解釋道。“為了加快執(zhí)行速度,不給程序員增加考慮代碼或目標機器的負擔(dān),現(xiàn)代CPU積累了一長串越來越奇特的功能,旨在盡可能快地運行隨機未知代碼。”

多年來不斷發(fā)展的技術(shù)包括:

●超標量架構(gòu),其特點是解碼器可以同時向一系列并行的功能單元發(fā)出多條指令。

●推測執(zhí)行,即CPU在分支決策之前推測執(zhí)行它認為最有可能的分支結(jié)果。如果猜測正確,則向前邁出一步。如果猜測錯誤,則必須刷新通道并運行另一個分支。

●無序執(zhí)行,只要序列中的多條指令不相互依賴,它們就會無序運行。

●實時內(nèi)存訪問跟蹤,其中可能同時向內(nèi)存發(fā)出多個內(nèi)存請求。根據(jù)擁塞和流量情況,一些較晚發(fā)出的請求可能會較早返回。

盡管做出了這些努力,但仍存在一些瓶頸。首先是從內(nèi)存中獲取數(shù)據(jù)所需的時間,這通常需要數(shù)百個周期。多個CPU和線程可以發(fā)出多個請求,重疊它們的訪問時間以最大限度地減少明顯的延遲。緩存有助于最大限度地減少未來訪問的延遲,但如果一個線程更改了其他線程正在使用的值,則保持一致性需要花費時間。

第二個瓶頸是由線程之間的數(shù)據(jù)依賴引起的同步問題。如果多個線程想要訪問相同的數(shù)據(jù),那么在數(shù)據(jù)被更改時,可能需要鎖定這些數(shù)據(jù)以供獨占使用,并在之后釋放該鎖。或者,如果多個線程正在參與整體計算,那么可能會存在一個點,所有線程都必須完成它們的工作之后,其他線程才能繼續(xù)。管理同步的開銷可能相當大。

第三個瓶頸涉及指令級并行性,即多條指令同時執(zhí)行。超標量CPU明確支持該行為,但它們也有限制。

Flow Computing首席技術(shù)官兼首席架構(gòu)師Martti Forsell表示:“CPU無法正確處理延遲隱藏。它們無法正確處理同步,無法正確處理低級并行性。”

一致性延遲

此外,緩存可以緩沖數(shù)據(jù),以應(yīng)對較長的DRAM訪問時間。但緩存系統(tǒng)通常是分層的,混合了私有緩存和共享緩存。Cadence硅片解決方案事業(yè)部高級產(chǎn)品營銷部總監(jiān)Arif Khan表示:“影響性能的基本選擇是通過增加多級緩存來優(yōu)化引用局部性。”一級(L1)緩存最靠近CPU,優(yōu)先考慮快速訪問。它們通常是私有緩存,這意味著只有一個CPU可以訪問它們。

一些CPU還提供私有二級(L2)緩存。這樣做的好處是能夠?qū)⒏鄶?shù)據(jù)保存在緩存中,同時將部分數(shù)據(jù)移至更大且速度稍慢(但更便宜)的L2緩存。有了這些私有緩存,如果多個CPU需要訪問相同的數(shù)據(jù),則每個單獨的緩存中都會保留一份副本。“在CPU中,由于私有緩存的存在,一致性問題是不可避免的,”Forsell指出。

一些CPU具有共享的L2緩存,大多數(shù)3級(或最后一級)緩存也是共享的。共享緩存的好處是多個CPU可以訪問單個數(shù)據(jù),而無需單獨的副本。但L2共享通常發(fā)生在兩個或四個CPU之間。因此,具有該結(jié)構(gòu)的八核處理器將具有兩個L2緩存,并且共享不會在它們之間交叉。這意味著,如果在具有不同L2緩存的兩個CPU上執(zhí)行的兩個線程需要相同的數(shù)據(jù),則每個L2緩存都必須有自己的副本才能保持一致。只有最后一級緩存(LLC)始終在所有CPU之間共享,并且不需要一致性。

640 (1).png

圖1:緩存層次結(jié)構(gòu)示例。L1緩存通常專用于一個CPU。L2緩存也可能如此,或者它們可能由所有或部分CPU共享。最后一級緩存通常由所有人共享。來源:Bryon Moyer/Semiconductor Engineering

但共享也變得復(fù)雜。對于具有多個CPU的處理器,這些CPU通常分布在整個芯片上,因此很難放置一個統(tǒng)一的LLC,以便所有CPU都能以相同的延遲訪問它。而且更大的緩存是要付出代價的。“緩存越大,延遲越高,”Rambus的杰出發(fā)明家Steven Woo指出。在實踐中,雖然LLC在邏輯上被視為一個單元,但它在物理上被分成多個塊,每個塊都靠近一個CPU。

一致性協(xié)議已經(jīng)建立多年。Arm的CPU技術(shù)副總裁兼研究員Fred Piry表示:“MESI是最常見的緩存一致性協(xié)議,它將緩存行描述為被修改(M)、獨占(E)、共享(S)或無效(I)。

Woo表示:“目前,MESI是一種相當穩(wěn)定的協(xié)議。事實上,它并沒有發(fā)生太大的變化,這說明我們過去已經(jīng)做了很多工作(來對其進行微調(diào))。”

CPU向其他CPU發(fā)送消息,指示狀態(tài)變化。“如果您正在寫入已共享的行,則需要告訴其他CPU,‘我正在修改該緩存行,請忘掉它。我現(xiàn)在有了一個新版本。’在手機或筆記本電腦中,沒有那么多CPU,所以速度非???,”Piry說。“如果大型服務(wù)器中有數(shù)百個CPU,延遲可能會很明顯。”

跟蹤這些消息并非易事。“這可能很有挑戰(zhàn)性,因為你可能會遇到消息在系統(tǒng)中互相追逐的情況,”Woo說。“在最壞的情況下,如果你有一個大芯片,芯片一角的核心必須使另一角的核心無效。這需要遍歷整個芯片的時間,還需要消息在層次結(jié)構(gòu)中傳遞的時間。”

這通常發(fā)生在承載消息的專用一致性網(wǎng)格上,對于較小的處理器,延遲可能限制在10個左右的周期。“Arm的一致性網(wǎng)格網(wǎng)絡(luò)(CMN)支持AMBA CHI,就是這樣一種結(jié)構(gòu),”Khan指出。“IP提供商也在這個領(lǐng)域有解決方案。”

但是對于具有多個核心的處理器來說,該網(wǎng)格在消息通過時可能會遇到擁塞和延遲,最壞的情況可能會花費大約1000個周期的時間。

640 (1).png

圖2:緩存更新延遲。對于多核系統(tǒng)來說,更新緩存可能需要相當多的周期。來源:Bryon Moyer/Semiconductor Engineering

這種一致性活動發(fā)生在硬件和系統(tǒng)軟件層面的幕后,因此應(yīng)用軟件開發(fā)人員幾乎沒有控制權(quán)。然而,他們最有能力根據(jù)程序的結(jié)構(gòu)以及線程之間共享變量的方式影響性能。對于硬件設(shè)計師來說,最好的選擇是調(diào)整緩存大小、緩存隱私和一致性網(wǎng)格。改進它們可以提高性能,但會增加芯片尺寸和成本,并增加功耗。

Synopsys ARC-V RPX處理器產(chǎn)品經(jīng)理Mohit Wani表示:“高效一致的共享緩存架構(gòu)是必不可少的,對于最大限度地減少參與共享計算的所有線程的共享數(shù)據(jù)訪問延遲來說。”

同步延遲

兩種主要的同步機制是鎖(也稱為互斥,即“相互排斥”)和屏障。鎖會獲取多個CPU可訪問和使用的數(shù)據(jù),并將訪問限制在單個CPU上。這有助于確保每個CPU都使用相同的值處理相同的數(shù)據(jù),并且不會有CPU使用舊版本或中間版本,而其他CPU使用新版本。

屏障限制代碼在特定點之外的執(zhí)行,允許所有對結(jié)果有貢獻的線程追趕并完成,然后任一線程才能繼續(xù)執(zhí)行結(jié)果。歸約算法就是一個例子,它可能涉及多個線程計算單個結(jié)果。

至少有兩種方法可以實現(xiàn)這兩種工具,而且這兩種方法都有成本。“有時,當遇到障礙時,人們所做的相當于進入睡眠狀態(tài),然后像中斷這樣的操作會再次喚醒他們,”Woo解釋道。“中斷的成本很高,而且發(fā)送所有釋放消息和重新啟動內(nèi)核都需要花費大量時間。”這樣做的好處是可以節(jié)省電量,因為內(nèi)核在等待時處于睡眠狀態(tài)。

另一種方法是使用標志或信號量,內(nèi)核執(zhí)行一個繁忙循環(huán)來輪詢標志,以查看標志何時發(fā)生變化。“當內(nèi)存位置的值發(fā)生變化時,它們就知道可以繼續(xù)前進了,”Woo說。這種技術(shù)響應(yīng)速度更快,因為它不涉及中斷,但內(nèi)核在等待時旋轉(zhuǎn)會消耗更多能量。

此外,空閑核心上的線程可能會在此期間被其他線程替換,而這些上下文交換也很昂貴。“當暫停某項任務(wù)以騰出處理器核心去等待其他任務(wù)趕上進度時,上下文切換開銷會產(chǎn)生很大的損失,”Wani指出。

最后,就像一致性一樣,一旦釋放屏障或鎖,消息就會發(fā)送到其他核心,對于多核單元來說,這些周期可能多達數(shù)千個。“如果您的系統(tǒng)中有100個CPU,命令將傳播到系統(tǒng)中的所有CPU,”Piry解釋道。“并且所有CPU都將收到同步請求并確認已收到并完成。此外,它們需要根據(jù)命令進行操作,這可能需要數(shù)千個周期。”

640 (1).png

圖3:同步延遲。頂部顯示CPU n設(shè)置了屏障;然后它計算其部分的時間比其他CPU更長。因此,其他CPU必須在完成后等待,直到CPU n釋放屏障。類似地,當CPU設(shè)置鎖時,在釋放鎖之前,其他CPU都無法訪問該數(shù)據(jù)。來源:Bryon Moyer/Semiconductor Engineering

“CPU硬件可以通過提供優(yōu)化線程同步、數(shù)據(jù)共享的指令集和內(nèi)存架構(gòu)來提供幫助,”Wani說道。一些用于嵌入式的小型處理器帶有硬件信號量或郵箱來加速同步。這種方法雖然適合小型CPU,但擴展性不佳。

更復(fù)雜的單元會執(zhí)行特定指令,例如內(nèi)存原子指令。它們以原子方式執(zhí)行讀取/修改/寫入序列,這意味著在完成之前,沒有其他實體可以看到或影響結(jié)果。此類指令有助于避免需要顯式同步的數(shù)據(jù)危害。

程序架構(gòu)也是一個重要的工具。“解決同步開銷的最佳方法是,采用一種可以降低線程需要同步的頻率的軟件架構(gòu),”Wani說。

指令級并行

并行執(zhí)行可以在多個級別進行。指令級并行是指同時執(zhí)行多條指令。這是現(xiàn)代超標量CPU所允許的,但有限制。“您可以在超標量進程中的多個功能單元執(zhí)行多條指令,但要求是這些指令必須是獨立的,”Forsell說。

圖4顯示了10寬度CPU微架構(gòu)的一部分,反映了當今商用的最寬CPU。根據(jù)定義,這里可能的最大并行度是10,但有兩個問題。第一個問題與功能單元的分布有關(guān),而第二個問題則來自數(shù)據(jù)依賴性。

10寬度CPU有10組可用功能單元,而哪組獲得指令取決于指令是什么。在圖4中的虛構(gòu)示例中,每組有兩個功能單元,其中一個是整數(shù)ALU。因此,對于整數(shù)運算,最多可以同時運行10個。但只有五個有浮點單元,兩個有位操作單元,乘法器、除法器和融合乘加(FMA)各有一個。因此,假設(shè)最多兩個位操作可以一起運行,但乘法、除法和FMA不可能并行。

640 (1).png

圖4:超標量CPU功能單元。并非所有功能單元通道都具備相同的功能,某些功能可能僅在少數(shù)甚至一個通道中可用。來源:Bryon Moyer/半導(dǎo)體工程

這些并行機會反映了最大可能性,并且只有當并行計算中涉及的變量不相互依賴時才會發(fā)生這種情況。例如,如果一個操作依賴于前一個操作的結(jié)果,那么這兩個操作必須連續(xù)執(zhí)行。

再次強調(diào),軟件架構(gòu)是實現(xiàn)并行性最大化的最強大杠桿。“算法始終是優(yōu)化給定硬件平臺性能的最佳方式,”Khan說道。“分布式數(shù)據(jù)并行和完全分片數(shù)據(jù)并行技術(shù)可用于模型復(fù)制和數(shù)據(jù)分區(qū),從而實現(xiàn)最佳系統(tǒng)利用率和模型性能。”

識別數(shù)據(jù)依賴關(guān)系需要軟件分析??梢造o態(tài)分析聲明的變量,編譯器可以以最大化目標CPU性能的方式對目標代碼進行排序。然而,許多程序大量使用指針,而這些指針無法靜態(tài)分析,因為它們的值是實時確定的。動態(tài)分析,監(jiān)控加載和存儲的訪問模式,可能是必要的。在這種情況下,分析結(jié)果可以幫助開發(fā)人員優(yōu)化程序的并行性,同時確保依賴關(guān)系得到尊重。

控制和數(shù)據(jù)平面

線程運行一系列指令而不進行任何分支(所謂的基本塊),可以實現(xiàn)最大程度的并行性。分支會帶來不確定性,嘗試推測性地執(zhí)行可能會以錯誤猜測和系統(tǒng)調(diào)整時出現(xiàn)故障而告終。

工程師有時會描述兩種編碼風(fēng)格:一種用于控制,一種用于數(shù)據(jù)操作。這種區(qū)別是網(wǎng)絡(luò)處理芯片架構(gòu)的基礎(chǔ),它提供專用硬件來對數(shù)據(jù)進行長串計算,并輔以CPU來執(zhí)行控制代碼,這通常涉及許多分支。數(shù)據(jù)平面中的代碼比控制代碼更適合并行執(zhí)行。

鑒于傳統(tǒng)CPU架構(gòu)中性能提升的機會有限,有人建議,為類似數(shù)據(jù)平面的代碼配備一個單獨的硬件單元,可以大大提高并行性,而這比單獨使用CPU所能達到的水平要好得多。“現(xiàn)在,所有性能級別的平臺都接受了一個想法:將結(jié)構(gòu)化任務(wù)從通用CPU中卸載,并將這些任務(wù)轉(zhuǎn)移到特定于任務(wù)的專用處理引擎上,”Roddy說。

初創(chuàng)公司Flow Computing正在提供這樣的單元。Flow Computing首席執(zhí)行官Timo Valtonen解釋說:“這是一個與CPU緊密集成在同一塊硅片上的IP塊。它會像GPU或神經(jīng)加速器一樣掛在總線上。它是一個可配置的小型處理器陣列,可以執(zhí)行并行代碼,而不需要太多屏障或鎖。”

640 (1).png

圖5:建議的具有專用并行處理單元的架構(gòu)。CPU控制流程并將工作負載交給并行單元。CPU有效地執(zhí)行控制流,并行單元執(zhí)行相當于數(shù)據(jù)位置代碼的代碼。來源:Bryon Moyer/Semiconductor Engineering

提議的單元有一個由其所有核心共享的大型緩存,從而消除了一致性延遲。如果主CPU和并行單元都在處理一些相同的數(shù)據(jù),那么CPU緩存和并行單元緩存之間的一致性將是必要的,但Flow認為這不太可能。

使用光纖提供了一種輕量級的方式來處理原本應(yīng)該是線程的情況。光纖由CPU創(chuàng)建,可以傳遞給加速器,并避免了處理線程所需的操作系統(tǒng)服務(wù)調(diào)用。這可以減輕一些同步延遲。

將指令鏈接在一起的能力可以最大化指令級并行性。“鏈接就是將一條指令的輸出直接輸入到下一條指令中,”Woo解釋道。“自20世紀80年代和90年代初以來,Cray等公司的超級計算機就一直在做同樣的事。”

使用并行單元需要重新編譯代碼。“我們確實應(yīng)用了一種特殊的編譯算法來處理具有依賴關(guān)系的代碼,以實現(xiàn)鏈式執(zhí)行,”Forsell說。新代碼可以讓CPU交出高度并行的部分,依賴性分析允許將流經(jīng)并行單元的指令鏈式化。

但問題是,整個代碼庫將使用CPU的原生語言。編譯器不會為并行部分生成單獨的目標代碼。這意味著并行單元必須配備解碼器和其他與隨附CPU鏡像對應(yīng)的邏輯。這項工作需要與CPU供應(yīng)商合作完成,因為解碼其他人的指令集可能被視為侵犯知識產(chǎn)權(quán)。

然而,編譯器并不是萬能的工具。“你必須記住,編譯器重視正確性而不是性能,”Woo警告說。“他們有時必須做出保守的假設(shè),而不是激進的假設(shè)。為了充分利用系統(tǒng),程序員必須輸入指令或繞過編譯器的自動代碼生成。”

超越漸進式增長

盡管CPU設(shè)計師們一直在努力尋找提高性能的機會,但唾手可得的成果早已不復(fù)存在。屋頂線模型描述了計算在何處受到內(nèi)存帶寬的限制以及計算受限于何處,它可以幫助開發(fā)人員確定改進的機會及其相關(guān)成本。但如果沒有一些改變游戲規(guī)則的開發(fā),改進將隨著每一代而逐漸增加。

Synopsys指出了其用于提高性能的四種架構(gòu)理念。

●使更高級別的緩存可配置為更大的緩存或更小的緩存加上一些內(nèi)存,并能夠動態(tài)重新配置以適應(yīng)當前工作負載;

●在每個緩存級別,使用預(yù)取器來隱藏更多的獲取延遲;

●即使使用有序CPU,也允許無序內(nèi)存請求,這樣即使先前的請求仍處于掛起狀態(tài),也可以使用先返回的任何內(nèi)容;

●使用軟件實現(xiàn)服務(wù)質(zhì)量(QoS),以便為關(guān)鍵工作負載的某些核心提供優(yōu)先權(quán)。

并行卸載單元是否會成為更大的游戲規(guī)則改變者?這是有可能的,只要系統(tǒng)開發(fā)人員認為它能夠順利地融入他們現(xiàn)有的工作方式。如果變化太多,設(shè)計師(他們大多天性保守)會抵制如此多的變化可能給項目帶來的風(fēng)險。此外,增量硅片空間必須增加足夠的價值,以保持芯片的適當盈利。這可能會使其對專用SoC更具吸引力,因為增加的性能的價值是顯而易見的。

與此類加速器相關(guān)的工具和開發(fā)流程也需要順利融入現(xiàn)有流程,這又要尊重程序員不愿做出過多改變的心理。即使硬件理念及其相關(guān)工具在概念上無可挑剔,新用戶仍然需要說服自己硬件和軟件實現(xiàn)是正確的,沒有錯誤。

Flow是否能取得成功,可能有助于決定該技術(shù)的發(fā)展方向。如果失敗了,是因為概念上的根本缺陷,還是因為執(zhí)行上的問題?如果是后者,其他人可能會接手并繼續(xù)發(fā)展。如果是前者,那么整個想法都會受到質(zhì)疑。

另一方面,如果它成功了,可以打賭其他人會試圖模仿并改進它的成功??紤]到這個提議還處于早期階段,我們可能至少有一年甚至更長的時間來確定是否有一個贏家。

THEEND

最新評論(評論僅代表用戶觀點)

更多
暫無評論