一個(gè)L1 DATA CACHE相當(dāng)于一塊小的內(nèi)存,我們假設(shè)它為16K大,它會(huì)與一般物理內(nèi)存交互。
它和內(nèi)存交互一般一次傳輸16個(gè)字節(jié)(32個(gè)字節(jié)),也就是:
CACHE 字節(jié)0-15一次寫(xiě)到/讀取物理內(nèi)存 ,字節(jié)16-31一次寫(xiě)到/讀取物理內(nèi)存.32-47 ... ...
這些一次被傳輸?shù)淖止?jié)被稱(chēng)為cache line。
--------------------------------------------------------------
另外,cache寫(xiě)到物理內(nèi)存的位置不是任意的,
我們假定內(nèi)存為64K,那么cache地址0的數(shù)值只能和物理內(nèi)存的地址0, 16K, 32K交互;cache地址1的數(shù)值只能和物理內(nèi)存的地址1, 16K+1, 32K+1交互
。。。 。。。cache地址16K-1的數(shù)值只能和物理內(nèi)存的地址6K-1, 16K+16K-1, 32K+16K -1交互
這說(shuō)明了兩點(diǎn):
(1)假設(shè)對(duì)象A的一個(gè)字段長(zhǎng)為16個(gè)字節(jié),如果它放在物理地址 0-15,那么它將和cache的第一個(gè)cache line 交互,如果放在物理地址 8-23,那么
如果CPU要訪問(wèn)這個(gè)字段,必須將第一個(gè)和第二個(gè)cache line 都讀入,才能獲得這個(gè)字段的信息,顯然這樣速度慢,所以一般字段需要cache line對(duì)齊,
在這里就是16個(gè)字節(jié)對(duì)齊。
(2)關(guān)于colour
一般一個(gè)對(duì)象某些字段訪問(wèn)頻繁些。
假定一個(gè)cache(這個(gè)cache指slab的cache,不是上面提到CPU的L1 DATA CACHE)占用5個(gè)頁(yè)面也就是20K.
假定其中對(duì)象大小為32個(gè)字節(jié),前16個(gè)字節(jié)訪問(wèn)頻繁許多。
假定對(duì)象A起始于物理地址0,對(duì)象C起始于31,對(duì)象B起始于物理地址16K,那么對(duì)象A,對(duì)象B的前16個(gè)字節(jié)都和第一個(gè)cache line 交互,后16個(gè)字節(jié)都和第二個(gè)cache line 交互
對(duì)象C前16個(gè)字節(jié)與第3個(gè)cache交互。
我們假定內(nèi)核訪問(wèn)A后就訪問(wèn)B,再訪問(wèn)A,交錯(cuò)進(jìn)行,并且前16個(gè)字節(jié)次數(shù)都是50次,后16個(gè)為10次。C也是。
這樣第一個(gè)cache line 要交互100次,第二個(gè)20次,一共120次。
如果讓對(duì)象B向后移動(dòng)16個(gè)字節(jié),也就是對(duì)象B的前16個(gè)字節(jié)與第二個(gè)cache line 交互,后16個(gè)與第3個(gè)交互。
那么第一個(gè)為2次,因?yàn)橹挥虚_(kāi)頭結(jié)尾2次要與內(nèi)存交互,其它每次都在L1 DATACACHE 中寫(xiě)就可以了。第2個(gè)cache line為20次左右(后面的只須在CACHE中讀寫(xiě)),第3個(gè)cache line為20次,
3個(gè)line一共才41次,你不妨仔細(xì)模擬一下。
所以進(jìn)行錯(cuò)位能降低CACHE的交互次數(shù),從而提高CPU處理速度能力。
這個(gè)錯(cuò)位(也就是上面的16個(gè)字節(jié))就是colour.