2013-02-07 78 views
3

方案cpu緩存如何處理大內存對象?

  • 高速緩存(L1)的大小(CS):32kB的
  • 線尺寸(LS):64B
  • 關聯性(A):8
  • 集大小(SS): 512B(A * LS
  • 套(S):64(C/SS
  • 讀/寫的對象(O)的尺寸比LS

假設更大(如果無效指正):

  • 虛擬內存塊(容量4KB(SS * A的)表示爲B)以模似方式映射到集。換句話說,地址0x0 : 0xFFFF(塊索引(BI)0)被映射到集合0,0x1000 : 0x1FFFBI1)被映射到1,等等。
  • 讀取/寫入請求(不使用非時間性寫入/讀取)給定地址A要求找到其BI,然後將其移動到指定集。例如,A = 0x4600A將具有BI = 70.這BI被映射到集合6(BIS)。
  • 爲了正確(沒有未對齊)r/w對象(O)進行緩存,需要對齊LS

問題

  1. 請問O在緩存中連續對齊的,或者它可以採取(例如)免費時隙0 5,而不是0 2?
  2. 從緩存中檢索分區O的成本(懲罰)是多少?假設O未被分割爲幾個B
  3. 與上述相同的問題,但在O被置於兩個B中的情況下,因此使用了兩組。
  4. 如果O尺寸大於SS(512B),會發生什麼情況?它會將數據移動到L2並逐步將數據移動到L1嗎?它會使用其他套件嗎?
  5. 如果L2(和L3就此而言)對於所有數據來說太小,該怎麼辦?
+1

這和C++ 11有什麼關係? –

+0

@BartekBanachewicz主要是因爲'alignas()'提供了簡單和標準化的對齊操作。當您開始對齊數據以優化緩存性能時,我認爲自然會要求緩存大對象的成本。 –

+0

呃。這聽起來很像*過早的優化。 –

回答

1

虛擬存儲器塊(大小的4kB(SS * A)表示爲B的)被映射在模狀 到集。換句話說,地址0x0:0xFFFF (塊索引(BI)0)被映射到集合0,0x1000:0x1FFF(BI 1)是 映射到1,依此類推。 L1高速緩存和存儲器層級之間

轉移: L1高速緩存和存儲器層級的以下電平之間的傳送單元是的行大小(LS)字節的塊。也就是說,對於L1高速緩存,內存以64字節塊(LS字節)構成。

內存塊和高速緩存項之間的對應關係: 連續內存塊被映射到連續集的高速緩存行。因此,塊0(地址0x0000 : 0x003F)映射到集合0處的高速緩存行,塊1(地址0x0040 : 0x007F)映射到集合1處的高速緩存行,等等。


請求的讀/寫(無非時間寫/讀操作被使用)的 給定地址的需要找到其BI,然後將其移動到 分配集。例如,A = 0x4600A將具有BI = 70。該BI被映射到集合6(BI%S)的 。

正確的步驟,以找到塊標識符(或索引)和該組索引(SI)如下:

BI = A >> LS = 0x4600A >> 6 = 0x1180 
SI = BI & (S-1) = 0x1180 & 0x3F = 0x0000 
(when S is a power of two, BI & (S-1) = BI mod S) 

爲了正確地(無位置偏移)R/w緩存一個對象(O)到 ,LS的對齊是必需的。

這沒有必要。 O不需要被塊對齊。


Q1。請將O按順序排列在高速緩存中,否則可能需要(對於 實例)空閒插槽0 5而不是0 2?

O將存儲在具有緩存行粒度(集合k,k + 1,...,S-1,0,1,...)的連續集合中。第二季度銷售價格指數爲:

Q2。從緩存中檢索分區O的成本(懲罰)是多少? 假設O沒有被劃分爲幾個B. Q3。與上面相同的問題,但是當O被放置在兩個B中時,因此使用兩組。

我假設您對讀取緩存中的O字的CPU成本感興趣。 假設順序引用O,緩存訪問的數量將等於引用字的數量。我認爲成本不取決於塊在相同或不同的集合(至少在多端口緩存中)。

Q4。如果O尺寸大於SS(512B),會發生什麼情況?將 它將數據移動到L2並逐步移動數據到L1?它會使用 其他集? Q30。

Q5。如果L2(和L3就此而言)對於所有數據來說太小,該怎麼辦?

如果必須將塊分配給沒有空閒緩存行的組,則必須選擇一個塊才能被逐出(受害塊)。替換策略根據algorithm(LRU,pLRU,random)選擇受害塊。

+0

我不能投票,因爲這個主題是我的深度的方式,但我希望有更多的問答這樣的。口頭+1目前。 – deceze