自編教材分享:第八章—訪存優(yōu)化(四)



內(nèi)存優(yōu)化
減少內(nèi)存讀寫
內(nèi)存又可以叫做主存,是處理器能直接尋址的存儲(chǔ)空間,由半導(dǎo)體器件制成。以DDR3內(nèi)存來(lái)說(shuō),通常一次內(nèi)存讀寫大約要200~400個(gè)時(shí)鐘周期,訪問(wèn)內(nèi)存速度非常慢,因此在程序優(yōu)化的過(guò)程中應(yīng)當(dāng)優(yōu)先充分使用寄存器而不是訪存。大多數(shù)情況下,編譯器能夠很好地解決這個(gè)問(wèn)題,但是在具有存儲(chǔ)器別名情況或讀寫依賴情況下,需要優(yōu)化人員手動(dòng)處理。
原始代碼:
優(yōu)化后代碼:
數(shù)據(jù)對(duì)齊
當(dāng)處理器訪問(wèn)正確對(duì)齊的數(shù)據(jù)時(shí),它的運(yùn)行效率最高。當(dāng)數(shù)據(jù)值沒(méi)有正確對(duì)齊時(shí),處理器需要產(chǎn)生一個(gè)異常條件或執(zhí)行多次對(duì)齊的內(nèi)存訪問(wèn),以便讀取完整的未對(duì)齊數(shù)據(jù),導(dǎo)致運(yùn)行效率降低。所以處理器提供的對(duì)齊的數(shù)據(jù)訪問(wèn)指令效率要遠(yuǎn)高于非對(duì)齊的數(shù)據(jù)訪問(wèn)指令。
在32位處理器中,一個(gè)int型變量占4個(gè)byte,假設(shè)這個(gè)變量i在內(nèi)存中占據(jù)2、3、4、5這4個(gè)byte的位置,數(shù)據(jù)非對(duì)齊存儲(chǔ)如圖所示。

結(jié)構(gòu)體對(duì)齊
結(jié)構(gòu)體分配內(nèi)存空間時(shí)采用的對(duì)齊規(guī)則為,變量的起始地址能夠被其對(duì)齊值整除,結(jié)構(gòu)體變量的對(duì)齊值為最寬的成員大小;結(jié)構(gòu)體每個(gè)成員相對(duì)于起始地址的偏移能夠被其自身對(duì)齊值整除,如果不能則在前一個(gè)成員后面補(bǔ)充字節(jié);結(jié)構(gòu)體總大小能夠被最寬的成員的大小整除,如不能整除則在后面補(bǔ)充字節(jié)。
例如A結(jié)構(gòu)體的各成員所占內(nèi)存空間大小為sizeof(a)+sizeof(b)+sizeof(c),即1+4+4=9,而實(shí)際上結(jié)構(gòu)體的大小為sizeof(A)=12。內(nèi)存分配如圖所示。

在定義結(jié)構(gòu)體時(shí),應(yīng)按照成員大小從小到大或從大到小依次定義各成員。建議盡量大數(shù)據(jù)類型在前,小數(shù)據(jù)類型在后,一方面這樣會(huì)節(jié)省一些空間,另一方面可以更好地滿足處理器的對(duì)齊要求。
例如結(jié)構(gòu)體A1需要分配12字節(jié)的內(nèi)存空間,將結(jié)構(gòu)體內(nèi)成員順序進(jìn)行調(diào)整后得到A2結(jié)構(gòu)體,只需要分配8個(gè)字節(jié)空間,處理器訪問(wèn)2次內(nèi)存就可讀完數(shù)據(jù)。
直接內(nèi)存訪問(wèn)
直接內(nèi)存訪問(wèn)(Direct Memory Access,DMA),是一種廣泛應(yīng)用的硬件機(jī)制,可以直接傳輸外圍設(shè)備和主內(nèi)存之間的數(shù)據(jù),這樣處理器可以直接使用這部分的數(shù)據(jù),這種機(jī)制可以提升內(nèi)設(shè)備數(shù)據(jù)傳輸?shù)男剩珼MA機(jī)制如圖所示。

DMA機(jī)制與上文介紹的緩存機(jī)制的不同之處在于,DMA在處理器需要數(shù)據(jù)時(shí)會(huì)提前將數(shù)據(jù)搬移到處理器內(nèi),而緩存機(jī)制則是在需要數(shù)據(jù)的時(shí)候才搬移數(shù)據(jù),因此利用DMA機(jī)制,程序的執(zhí)行時(shí)間比利用緩存機(jī)制的更短。

以德州儀器C6678板卡為例,若數(shù)據(jù)存放在DDR中,需要讀取到緩存中就可以使用EDMA機(jī)制實(shí)現(xiàn)。在循環(huán)中EDMA讀數(shù)據(jù)需要采用EDMA _WAIT等待數(shù)據(jù)傳輸結(jié)束,偽代碼如下:
前文中提到的數(shù)據(jù)預(yù)取和直接內(nèi)存訪問(wèn),目的都是為了數(shù)據(jù)在使用前能從內(nèi)存調(diào)入緩存中,從而減少處理器停頓的訪存優(yōu)化方法。除了上述兩種方法外,還可以在指令層次將訪存與計(jì)算部分重疊,可以有效地解決訪存的延遲。

自編教材分享:第八章—訪存優(yōu)化(四)的評(píng)論 (共 條)
