數(shù)據(jù)傳輸是基于地址進(jìn)行的。在分析和設(shè)計(jì)微架構(gòu)時(shí),除了地址域之外,如何選擇地址信號(hào),我覺得也是值得注意的問題。
地址邊界
還記得剛開始工作時(shí),被安排維護(hù)AXI總線重排序的公共模塊,當(dāng)時(shí)有一個(gè)地址對(duì)齊的概念,如64Byte地址邊界、128Byte或者256Byte地址邊界,那會(huì)花了有一段時(shí)間才搞清楚,但也僅僅是搞清楚,也不清楚引入這一概念的原因,能解決哪些問題。
所謂地址邊界,若某地址能夠被一整數(shù)除凈,該地址就稱為整數(shù)對(duì)應(yīng)的地址邊界。在系統(tǒng)內(nèi)都是以0/1的二進(jìn)制,這一整數(shù)一般指的是2的冪次方,如4、8、16、64、128等等。舉例來說,0x200, 0x240, 0x880等等都是64Byte地址邊界;0x200,0x880是128Byte地址邊界,但0x240不是128Byte地址邊界。再談?wù)凜acheLine的概念。為提升系統(tǒng)訪問內(nèi)存的速度,通常會(huì)引入緩存Cache,也就是將Memory的內(nèi)容先搬運(yùn)到CPU附近。這一緩存是以塊為單位的,需要訪問時(shí),則先將對(duì)應(yīng)的緩存塊搬運(yùn)到Cache內(nèi)。這一緩存塊就稱為CacheLine,是緩存Cahe管理的最小單位,可基于系統(tǒng)需求選擇大小,如64Byte或128Byte,甚至是4KByte。每個(gè)CacheLine,除了存儲(chǔ)其本身的數(shù)據(jù)之外,還需要記錄其地址、是否修改等等額外信息。粒度越小,記錄額外信息的資源占比越大;粒度大了,又會(huì)對(duì)數(shù)據(jù)的利用率下降;具體大小則需基于需求來確定,如對(duì)于AI/GPU計(jì)算,可考慮使用4KByte的Caheline。
地址對(duì)齊
在考慮微架構(gòu)設(shè)計(jì)和軟硬件接口時(shí),訪問Memory盡可能按照整塊地址的訪問,地址邊界對(duì)齊,尤其是寫操作。在一般的CPU計(jì)算機(jī)系統(tǒng),采用的地址邊界大小至少為64Byte,使用更大的區(qū)間,如128Byte/256Byt,在一些場(chǎng)景也是能夠帶來收益的。
數(shù)據(jù)總線利用率
系統(tǒng)互聯(lián)總線的位寬較大,如128、256、512bit,甚至2048bit。但是,每一拍數(shù)據(jù)的地址并不是隨機(jī),而必須基于一定規(guī)則排列,參考AXI協(xié)議,如256bits的數(shù)據(jù)位寬,其地址低位必須是0-31。傳輸32Byte數(shù)據(jù),若起始地址為32Byte邊界對(duì)齊,1拍可以傳輸完成,利用率為100%,否則需要占用2拍,其利用率只有50%。
對(duì)于PCIe數(shù)據(jù)傳輸來說,其數(shù)據(jù)長(zhǎng)度單位為DW,即4Byte,因此由于地址邊界不對(duì)齊帶來的影響比較小。
Full/Partial Write
系統(tǒng)存在CacheLine的定義,若訪問操作為整CacheLine的寫操作,則稱為Full Write,否則為Partial Write。舉例,CacheLine為64Byte,若訪問地址低6位為0,長(zhǎng)度為64Byte,就是Full Write;低6位不為0,或長(zhǎng)度不為64Byte整數(shù)倍,則存在Partial操作。非地址對(duì)齊的訪問操作,容易造成Partial Write,引入性能問題。
Read-modify-write
對(duì)于Cache、DDR,或者其余類似的Memory系統(tǒng),存在最小操作粒度的概念。若寫訪問操作小于該最小操作粒度,則需要引入Read-modify-write。將對(duì)應(yīng)地址的數(shù)據(jù)塊讀取出來,進(jìn)行修改,再將數(shù)據(jù)寫入對(duì)應(yīng)地址,需要占用讀通道的帶寬。對(duì)于地址對(duì)齊的整塊訪問,直接寫入即可。
DMA的地址選擇
Host與PCIe Device之間大量數(shù)據(jù)的傳輸,基本都是由DMA(Direct Memory Access)完成的。簡(jiǎn)單來說,DMA就是從一個(gè)地址(源地址)讀取連續(xù)的數(shù)據(jù),再寫入到另一個(gè)地址(目的地址)。硬件邏輯提供源地址、目的地址和搬運(yùn)長(zhǎng)度的軟件編程接口,再被軟件進(jìn)行調(diào)用。復(fù)雜一些的硬件實(shí)現(xiàn),還可以支持描述符、鏈表、搬運(yùn)方式配置和其余系統(tǒng)屬性的配置等等特性,如支持完成中斷。
至于對(duì)數(shù)據(jù)搬運(yùn)的地址選擇,則是由調(diào)用DMA的軟件進(jìn)行控制的,但是也會(huì)受到上下游模塊的約束,如Device側(cè)的硬件引擎模塊等等。
在考慮DMA數(shù)據(jù)流時(shí),需基于系統(tǒng)層面對(duì)各模塊的數(shù)據(jù)訪問需求進(jìn)行設(shè)計(jì),盡可能使得DMA在Host和Device之間的數(shù)據(jù)搬運(yùn)是地址邊界對(duì)齊的。這一對(duì)齊包含兩個(gè)方面,一是訪問Device/Host的讀寫訪問是基于地址邊界對(duì)齊,二是源地址和目的地址的低位是相等的。兩者其實(shí)是類似的,沒有滿足后者,也會(huì)引入大量的非地址對(duì)齊的操作。至于后者的地址低位,則需基于硬件實(shí)現(xiàn)進(jìn)行考慮,考慮點(diǎn)就是上面描述的幾點(diǎn)要素。
再來看看第二方面引入的邏輯復(fù)雜度,源地址和目的地址的低位相等??紤]源和目的方向使用了AMBA總線,數(shù)據(jù)位寬為512bit/64Byte,若需支持地址不對(duì)齊的場(chǎng)景,則需要512個(gè)64bit位寬的MUX;若僅需支持地址的低6bit相等,則完全不需要進(jìn)行移位處理;若僅需支持地址的低2bit性能,硬件邏輯規(guī)模也減小為512個(gè)16bit位寬的MUX。大量的MUX邏輯也容易引入Congestion風(fēng)險(xiǎn),需要做額外的優(yōu)化處理。
結(jié)語
地址對(duì)齊的概念非常簡(jiǎn)單,但容易被忽略。對(duì)于軟件人員來說,DMA就是應(yīng)該支持任意地址到任意地址的數(shù)據(jù)搬運(yùn);但對(duì)硬件設(shè)計(jì)來說,可能需要付出很大的代價(jià)才能達(dá)成要求??梢钥紤]做一些折衷,軟件做一些簡(jiǎn)單修改,使用地址對(duì)齊的數(shù)據(jù)搬運(yùn),硬件實(shí)現(xiàn)側(cè)對(duì)地址對(duì)齊的操作進(jìn)行盡量的優(yōu)化,而對(duì)非地址對(duì)齊的做一些簡(jiǎn)化處理,不考慮性能但滿足功能,達(dá)到較優(yōu)的PPA。
-
數(shù)據(jù)傳輸
+關(guān)注
關(guān)注
9文章
1914瀏覽量
64646 -
地址
+關(guān)注
關(guān)注
1文章
32瀏覽量
10777 -
微架構(gòu)
+關(guān)注
關(guān)注
0文章
22瀏覽量
7048
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論