眾所周知,評(píng)估一顆芯片的好壞,PPA(performance,power,area)是最重要的指標(biāo)之一。我們往往要從性能,功耗,面積三個(gè)維度來評(píng)估設(shè)計(jì)方案,進(jìn)行trade-off。在設(shè)計(jì)的每個(gè)環(huán)節(jié)也會(huì)通過各種小技巧盡可能的全方位提升這三個(gè)指標(biāo)。
1
性能的評(píng)估——帶寬、吞吐量、時(shí)延
在討論如何提高性能之前,得先看看如何評(píng)估性能。
從直觀上來說,性能好代表著快。那么如何評(píng)估”快”呢?首先芯片根據(jù)應(yīng)用場景分為很多不同的種類,通信類的5G,藍(lán)牙,wifi;接口類的USB,以太網(wǎng),HDMI;計(jì)算類的通用CPU,GPU,AI等。在不同的場景下其實(shí)都能通過一些統(tǒng)一的指標(biāo)來衡量:帶寬(bandwidth),吞吐量(throughput)和時(shí)延(latency)。我們所熟悉的CPU性能跑分,從微觀層面來說,實(shí)際上評(píng)估的無非也是同一段時(shí)間內(nèi)系統(tǒng)能正確處理多少段標(biāo)準(zhǔn)的代碼,蘊(yùn)藏有吞吐量的概念在里面。在計(jì)算機(jī)網(wǎng)絡(luò)中,這三者的大致概念如下:
● 帶寬: 信道上單位時(shí)間內(nèi)能傳輸?shù)淖畲髷?shù)據(jù)量。
****● 吞吐量: 某段時(shí)間里,信道上單位時(shí)間內(nèi)的有效傳輸?shù)臄?shù)據(jù)量。
****● 時(shí)延: 每一次有效傳輸所需要的時(shí)間。
這三個(gè)概念既可以作為宏觀的計(jì)算機(jī)網(wǎng)絡(luò)傳輸性能指標(biāo),從微觀上來說,也可以作為芯片內(nèi)部數(shù)據(jù)計(jì)算,傳輸?shù)男阅苤笜?biāo)。比如AXI總線的數(shù)據(jù)傳輸,比如內(nèi)存訪問的數(shù)據(jù)傳輸,甚至是模塊與模塊間的數(shù)據(jù)傳輸。
以AXI總線為例,我們都知道這是一種高帶寬,高性能,低時(shí)延的總線,其與同為AMBA總線的AHB和APB的對比如下:
AXI的快,從帶寬,吞吐量以及時(shí)延的角度來說,主要得益于以下特性:
● 帶寬:
AXI支持更寬的總線寬度。更寬的總線寬度帶來的好處毋庸置疑,一個(gè)周期傳輸?shù)淖畲髷?shù)據(jù)量更大。形象點(diǎn)說就是公路更寬了。
● 吞吐量:
- 讀寫通道獨(dú)立帶來的讀寫并行操作。讀寫通道獨(dú)立意味著讀操作和寫操作可以并行。并行的好處自然是同一段時(shí)間內(nèi)可以同時(shí)進(jìn)行的讀和寫更多,完成的也更多,從而增加了一段時(shí)間內(nèi)的有效數(shù)據(jù)傳輸量,也就是吞吐量。
- 流水/分裂傳輸。這里的流水/分裂傳輸用AXI文檔里的說法叫outstanding。這是一種時(shí)間上的并行。在每筆讀/寫操作還未結(jié)束的時(shí)候就發(fā)送下一筆,這樣一來同樣一段時(shí)間內(nèi)并行的讀寫操作更多,傳輸數(shù)據(jù)更多,增加了吞吐量。
- 猝發(fā)傳輸。用于連續(xù)地址的讀寫訪問,一次地址發(fā)送在slave端可以同時(shí)訪問多個(gè)連續(xù)地址,同一段時(shí)間內(nèi)能訪問更多的地址,傳輸更多的數(shù)據(jù),增加了吞吐量。
- 亂序訪問。相比于順序訪問,總線上自由度更大。順序是一種約束,放寬了約束自然可以更肆無忌憚的傳輸數(shù)據(jù)。假設(shè)一種場景,傳輸1訪問地址空間A,三個(gè)周期讀回?cái)?shù)據(jù)。傳輸2訪問地址空間B,一個(gè)周期讀回?cái)?shù)據(jù)。因?yàn)轫樞虻募s束,先得到數(shù)據(jù)的傳輸2無法返回?cái)?shù)據(jù),必須等到傳輸1完成,這樣效率就很低。有了亂序的支持,后發(fā)出的操作如果先完成,可以先返回?cái)?shù)據(jù),這樣一來吞吐量自然就更高。
● 時(shí)延:
- 地址數(shù)據(jù)通道獨(dú)立。在AHB協(xié)議中,因?yàn)榈刂窋?shù)據(jù)通道共用,一次寫操作需要經(jīng)歷發(fā)送地址->發(fā)送寫數(shù)據(jù)這樣的步驟。而在AXI中,寫數(shù)據(jù)和寫地址可以同時(shí)發(fā)送,減小了一次寫操作所需要的時(shí)延。
- 多主從設(shè)備/仲裁機(jī)制。與APB只有一個(gè)apb master從而導(dǎo)致需要2個(gè)cycle才能完成傳輸不同,AXI與AHB都是多主從設(shè)備,可以直接點(diǎn)對點(diǎn)完成傳輸,1個(gè)cycle就可以完成傳輸,減小了時(shí)延。雖然仲裁機(jī)制的引入一定程度上又增加了時(shí)延,但基于流水分裂傳輸,性能還是可以得到保證。
從上述AXI的特性以及其對性能帶來的增益我們可以明顯看到,性能的提升手段有很多,但這里面蘊(yùn)藏的主要思想是類似的:提速與并行。道理很簡單,想要更快,那么在一段時(shí)間里就需要做更多的事。
2
性能的提升——提速與并行
提速指的是減小時(shí)延(latency),即減小每次有效輸出的時(shí)間。提速的方式可以來自于計(jì)算傳輸自身的算法優(yōu)化,硬件升級(jí)。比如我們在設(shè)計(jì)的時(shí)候經(jīng)常會(huì)做的去除冗余邏輯,本來1拍能做的事沒必要2拍,這就是一種自身算法優(yōu)化。而更先進(jìn)的工藝,更小的門電路延遲,也可以減小硬件時(shí)延,算作是一種硬件升級(jí)。
提速也可以來自于并行。并行又分為空間并行和時(shí)間并行。其主要區(qū)別在于空間并行需要更多的物理資源,通過更多的資源同時(shí)運(yùn)作來實(shí)現(xiàn)并行。而時(shí)間并行則是充分調(diào)度有限的資源,使其在一段時(shí)間內(nèi)盡可能少的處于閑置等待狀態(tài)。
舉一個(gè)最簡單的例子就是,你開了一個(gè)工廠,原計(jì)劃在1個(gè)禮拜內(nèi)完成一個(gè)項(xiàng)目交付,老板突然把要求提高了,讓你三天完成,怎么辦呢?可以有以下幾種處理方式。
- 請更多的工人,同樣一堆活丟給更多的人去做,這就是空間并行。
- 減少工人偷懶或者無所事事的時(shí)間,充分利用閑暇時(shí)間用來干活,同一時(shí)刻讓更多的工人處于干活狀態(tài),這就是時(shí)間并行。
- 每個(gè)工人提升工作效率,做一項(xiàng)工作的時(shí)間縮短,這樣相同時(shí)間就可以做更多工作,這可以類比于硬件上的算法優(yōu)化和先進(jìn)工藝。
在AXI的例子中,更寬的總線寬度,讀寫通道獨(dú)立,地址數(shù)據(jù)獨(dú)立屬于空間并行,用更多的總線資源換來速度。流水/分割,猝發(fā),亂序都是屬于時(shí)間并行。而多主從的連接方式則幫助到了傳輸本身的提速。
3
時(shí)間并行——隱藏latency
這里主要討論一下時(shí)間并行。還是基于AXI,從流水/分裂傳輸開始,也就是耳熟能詳?shù)腛utstanding。
Outstanding的英文含義是未完成的。在AXI協(xié)議中,Outstanding的意思是在一個(gè)讀寫操作還沒完成的時(shí)候就開始另外一個(gè)。
如下圖所示,水平方向表示時(shí)間,如果沒有Outstanding,那么總線在同一時(shí)刻只會(huì)有一個(gè)傳輸正在執(zhí)行。兩個(gè)傳輸必須要串行完成。這樣完成兩個(gè)讀操作總共需要100ns。
但我們通過觀察可以發(fā)現(xiàn),一個(gè)完整的讀操作由Master和Slave共同完成。Master處理地址發(fā)出讀請求,Slave處理請求返回?cái)?shù)據(jù)。如果把Master和Slave看成兩個(gè)工人,工人M處理完讀請求操作之后,在等待工人S返回?cái)?shù)據(jù)的20ns里其實(shí)是啥事都不做的偷懶狀態(tài)。為了提高效率,讓工人M不偷懶,可以讓他處理完第一筆讀請求操作之后馬上開始準(zhǔn)備發(fā)出第二個(gè)請求。如下圖所示:
在鞭策了M之后,他發(fā)出第一個(gè)讀請求之后,馬上馬不停蹄地開始處理第二個(gè)讀請求。于此同時(shí),S并行地處理著之前的第一個(gè)讀請求。當(dāng)M完成了第二個(gè)讀請求發(fā)出時(shí),因?yàn)镾已經(jīng)完成了第一個(gè)讀請求的數(shù)據(jù)返回,M可以立馬交付出自己的第二個(gè)讀請求,開始第3個(gè)讀請求的準(zhǔn)備。這樣一來完成兩次讀操作的總時(shí)間為80ns,相比第一種情況縮短了20ns。這20ns是S處理第一筆數(shù)據(jù)的時(shí)間,也就是latency,它被“隱藏”在M的第二次操作里。
上述的情況中,有一個(gè)前提條件是,S端返回讀數(shù)據(jù)的latency要小于M發(fā)出讀請求處理的latency。這樣才能保證M發(fā)出讀請求的時(shí)候S能馬上收走。因?yàn)樵贏XI中是握手傳輸,即需要M端valid與S端ready信號(hào)同時(shí)有效才能進(jìn)行傳輸。如果S某一次返回讀數(shù)據(jù)的latency大于M端,M在完成了一次讀請求之后需要等待S端的ready信號(hào),從而還是會(huì)有閑置狀態(tài),如下圖所示:
在上圖中,由于在第二次傳輸?shù)臅r(shí)候Master等待了10ns,三次讀操作總共用了140ns。
一個(gè)解決此問題的辦法是改變M和S的交互方式。假想M發(fā)出請求之后,如果有個(gè)地方可以緩存這個(gè)請求,M就可以騰出手去做別的事了。這個(gè)緩存可以用BUF來做到。如果S特別慢,M發(fā)出好幾個(gè)請求S都來不及收,就緩存更多,并滿足先發(fā)的請求先被處理,則可以使用FIFO進(jìn)行銜接。如下圖所示:
在有了BUF緩存之后,M的第二次操作完成時(shí)可以直接進(jìn)行第三次操作,以此節(jié)省了10ns的等待時(shí)間,三次讀操作總共只需要130ns。在AXI里,如果有outstanding設(shè)置,M與S之間都會(huì)有buffer來進(jìn)行此類緩存,保證同時(shí)可以有多個(gè)數(shù)據(jù)傳輸并行。此時(shí)的slave ready信號(hào)其實(shí)是這些緩存FIFO的非滿信號(hào)。
從上面的例子中,我們看到了outstanding的魔力,成功地將latency隱藏起來,從而提升了系統(tǒng)的性能。這里的性能提升點(diǎn)為吞吐量,因?yàn)閱挝粫r(shí)間的有效輸出數(shù)據(jù)增加了。并行之所以重要,是因?yàn)樵谶@些例子里的時(shí)延latency,即master發(fā)出讀請求和slave返回讀數(shù)據(jù)本身需要的時(shí)間,一般來說是比較難降低的。Master發(fā)出讀請求前需要處理計(jì)算地址,以及slave返回?cái)?shù)據(jù)時(shí)可能有的Memory讀取時(shí)間,在設(shè)計(jì)沒太大毛病的基礎(chǔ)上,要縮短只能靠工藝的升級(jí),內(nèi)存結(jié)構(gòu)的改變。而要提高系統(tǒng)的吞吐量,只能想辦法將一部分latency隱藏起來。
4
時(shí)間并行的瓶頸
以上的一切看起來很好,但如果這樣的并行技術(shù)那么牛逼,照理說我們可以使系統(tǒng)無限快才對。當(dāng)然這樣的技術(shù)還是有一定的局限性的。它使用的前提是Master端是效率的瓶頸。如果Slave端總是比Master端更慢,那么實(shí)際上系統(tǒng)的吞吐量并不能得到增加,看以下兩個(gè)例子:
從上面兩圖的對比我們可以看到,雖然Outstanding技術(shù)可以幫助Master以最快速度發(fā)出三個(gè)請求,但這三筆讀數(shù)據(jù)最后完成的時(shí)間和與不使用該技術(shù)是完全一樣的。這是因?yàn)樵诖死又蠸lave端的處理速度才是瓶頸所在。
那么如何解決這個(gè)問題呢?其實(shí)這個(gè)問題一直是計(jì)算機(jī)系統(tǒng)效率提升的頭號(hào)問題,即著名的”Memory Wall”??梢詫⑸蠄D中的Master看作是CPU計(jì)算單元,Slave看作是系統(tǒng)內(nèi)存DRAM Memory。因?yàn)樵L問系統(tǒng)內(nèi)存的時(shí)間本身遠(yuǎn)遠(yuǎn)大于CPU計(jì)算單元本身處理,而 CPU在變得原來越快(多核處理器,superscalar等),DRAM的讀取速度相比之下比較難提高(雖然有DDR,HBM等技術(shù),但還是要寄希望于DRAM本身的提高),這個(gè)差距在越拉越大。
目前在計(jì)算機(jī)體系中使用的是緩存技術(shù),用高速的SRAM作為一個(gè)“假”的Memory來進(jìn)行訪問。只在必要的時(shí)候訪問DDR。對應(yīng)到上圖中實(shí)際上是縮短了藍(lán)色色塊Slave返回讀數(shù)據(jù)的時(shí)延latency。
5
完美的時(shí)間并行——Pipeline
從上面的Outstanding技術(shù)中,我們可以發(fā)現(xiàn),Master與Slave端自身的Latency對并行的效果會(huì)有很大影響。如果Slave端Latency較大,Outstanding無法很好起到提升吞吐量的效果,并且Master需要很多的BUF來儲(chǔ)存自己的數(shù)據(jù)。而如果Master的Latency較大,上述的Outstanding是否效率最高呢?
從上圖中我們可以看到,雖然Master端效率達(dá)到了最高,工人M一刻不停歇地處理數(shù)據(jù),但是Slave在接受處理完Master發(fā)出的第一個(gè)請求后,有10ns的空閑時(shí)間在等待M的第二個(gè)讀請求。因?yàn)镸aster是主動(dòng)方,Slave在收到Master的請求之前沒法做別的事,要避免Slave白等,只能將Master提速。如果Master的latency也是20ns,那么系統(tǒng)中將沒有任何等待,如下圖所示:
我們知道,如果你遲到了,讓一個(gè)人某一次等了一個(gè)小時(shí),可能他沒什么感覺,也不會(huì)生氣。但如果每天都讓別人等1小時(shí),一個(gè)月是30小時(shí),相當(dāng)于這個(gè)人這個(gè)月花了一天的時(shí)間來等你,他還能沒感覺嗎?
對于系統(tǒng)來說也是一樣的道理。某次傳輸存在等待問題不大,但若每一次傳輸都存在等待,整個(gè)系統(tǒng)的效率將大大降低。因此最完美的并行是沒有等待的并行,也就是master發(fā)出請求的時(shí)候,slave剛剛處理完上一個(gè)請求,準(zhǔn)備開始下一個(gè)。
以上的討論都基于兩個(gè)工作者,M和S。但就像大魚吃小魚一個(gè)道理一樣,你是一個(gè)人的Slave,也會(huì)是其他人的Master,生物鏈?zhǔn)且画h(huán)扣一環(huán)的。系統(tǒng)也一樣,有可能是層層往下傳遞的。上述的例子讀操作起始于M,經(jīng)過S,終止于M。如果加上AXI的網(wǎng)絡(luò)(實(shí)際情況也不會(huì)是直接bypass訪問),Slave1在接收到讀請求之后,只是將其做了預(yù)處理,又繼續(xù)往下發(fā)放到Slave2, Slave3, 直到真正的Memory Slave,如下圖所示:
上圖是一種理想狀態(tài),每一對M與S都不存在等待問題,這在現(xiàn)實(shí)中很難做到,因?yàn)椴煌墓δ軌K時(shí)延Latency很難做到一致。但還是先來看看這種理想狀態(tài)。
因?yàn)榧?jí)數(shù)增多了,總的效率提升更為顯著。并且隨著傳遞深度的提升,Latency的隱藏更為顯著。整段時(shí)間內(nèi)最多有4個(gè)任務(wù)在并行,并且這四個(gè)任務(wù)的Latency相等,有多達(dá)3段latency被完美隱藏!
這么完美的并行技術(shù),無法天然形成,但不利用豈不可惜!我想大家都已經(jīng)知道了,這就是經(jīng)典的Pipeline技術(shù)。我們會(huì)將一些時(shí)延較長的電路手動(dòng)分割成幾個(gè)部分,每個(gè)部分之間有寄存器鏈接,這樣一來雖然每個(gè)部分的時(shí)延latency不同,都會(huì)在一個(gè)時(shí)鐘周期的時(shí)候同時(shí)更新:Master在時(shí)鐘上升沿傳遞數(shù)據(jù),Slave在時(shí)鐘上升沿完成上一數(shù)據(jù)處理。Pipeline技術(shù)大大提高了系統(tǒng)的吞吐量,深度越深,提升越顯著。
理論上來說,任何的電路都可以使用Pipeline技術(shù),但最經(jīng)典的應(yīng)用莫過于CPU流水線處理器。下圖是經(jīng)典的MIPS 5級(jí)Pipeline處理器流程:
指令的生命周期分別有5個(gè)階段: Fetch讀取指令,Decode指令解碼,Execute指令執(zhí)行,Memory內(nèi)存訪問,以及Write Back指令回寫寄存器。最后一步結(jié)束后一條指令即完成執(zhí)行。從上圖可以看出,在不考慮數(shù)據(jù)依賴關(guān)系的理想狀態(tài)下,有了Pipeline并行技術(shù)的加持,在從第5個(gè)周期開始,每個(gè)周期都可以完成一條指令,大大提高了吞吐量!
6
小結(jié)
今天介紹的并行技術(shù)其實(shí)只是拋磚引玉,也只是設(shè)計(jì)中并行思想的冰山一角。這種思想可以是outstanding,可以是pipeline,其實(shí)還可以是很多很多其他的技術(shù)細(xì)節(jié)。希望大家能應(yīng)用到平時(shí)的設(shè)計(jì)中,多想想那些地方是存在等待的,那些地方就是效率提升點(diǎn)。
評(píng)論
查看更多