Cacheline技術淺析
阿新 • • 發佈:2019-02-10
最近組內有個同事在做cacheline相關的特性,向其學習了一下,對原來的cacheline的理解更近了一步。這裡總結一下。請彭超大俠有空的話幫忙在斧正一下
Cache就是對記憶體的內容進行快取的一個硬體。cache和記憶體的邏輯關係結構如下圖所示。從左往右,從上到下逐個說明
首先實體記憶體又是通過實體地址PA(physical address)標識的,記憶體塊用PA+SIZE表示,在讀取記憶體的時候,CPU會將記憶體塊load到cache中,但是並不是按照SIZE的大小load記憶體塊,而是按照cacheline的大小load一個記憶體塊,指定的實體記憶體塊將被包含在這段被load的記憶體中(如上圖黃色+藍色部分所示,黃色代表了記憶體塊在cacheline大小的記憶體塊中的位置)。所以在程式設計的時候,儘量將結構設計為cacheline對其的,一次可以載入完成,訪問下個結構體的時候,就可以直接訪問另一個cacheline,而不發生衝突了。 實體地址又被分為三個部分,tag+index+offset。index就是實體地址在cache這個大陣列中的位置,相當於陣列索引,索引到了後,offset說明了PA所在的記憶體在cacheline中的偏移量。 這樣看來,就會發現很可能兩個實體地址中見的index很有可能發生重複,這就是cacheline衝突。這樣的情況下,就要先廢除cacheline上前一個的內容後重新載入新的記憶體才會有效。這樣的衝突會大大降低記憶體的訪問效率,所以intel有提出了一種更新的架構,如下圖所示
在每個cacheline的下一級又多了way的概念,每個cacheline的下一級又被分為4WAY或8WAY,每個way都相當於一個cacheline。這樣即使index衝突,也可以將記憶體內容放到不同的way中減少衝突。tag就是用來表示是那個way上的。上面的結構就是所謂的4路組相連或8路組相連的概念。
首先實體記憶體又是通過實體地址PA(physical address)標識的,記憶體塊用PA+SIZE表示,在讀取記憶體的時候,CPU會將記憶體塊load到cache中,但是並不是按照SIZE的大小load記憶體塊,而是按照cacheline的大小load一個記憶體塊,指定的實體記憶體塊將被包含在這段被load的記憶體中(如上圖黃色+藍色部分所示,黃色代表了記憶體塊在cacheline大小的記憶體塊中的位置)。所以在程式設計的時候,儘量將結構設計為cacheline對其的,一次可以載入完成,訪問下個結構體的時候,就可以直接訪問另一個cacheline,而不發生衝突了。 實體地址又被分為三個部分,tag+index+offset。index就是實體地址在cache這個大陣列中的位置,相當於陣列索引,索引到了後,offset說明了PA所在的記憶體在cacheline中的偏移量。 這樣看來,就會發現很可能兩個實體地址中見的index很有可能發生重複,這就是cacheline衝突。這樣的情況下,就要先廢除cacheline上前一個的內容後重新載入新的記憶體才會有效。這樣的衝突會大大降低記憶體的訪問效率,所以intel有提出了一種更新的架構,如下圖所示
在每個cacheline的下一級又多了way的概念,每個cacheline的下一級又被分為4WAY或8WAY,每個way都相當於一個cacheline。這樣即使index衝突,也可以將記憶體內容放到不同的way中減少衝突。tag就是用來表示是那個way上的。上面的結構就是所謂的4路組相連或8路組相連的概念。