- 高速緩存(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 : 0x1FFF
(BI
1)被映射到1,等等。 - 讀取/寫入請求(不使用非時間性寫入/讀取)給定地址
A
要求找到其BI
,然後將其移動到指定集。例如,A
= 0x4600A將具有BI
= 70.這BI
被映射到集合6(BI
%S
)。 - 爲了正確(沒有未對齊)r/w對象(
O
)進行緩存,需要對齊LS
。
問題:
- 請問
O
在緩存中連續對齊的,或者它可以採取(例如)免費時隙0 5,而不是0 2? - 從緩存中檢索分區
O
的成本(懲罰)是多少?假設O
未被分割爲幾個B
。 - 與上述相同的問題,但在
O
被置於兩個B
中的情況下,因此使用了兩組。 - 如果
O
尺寸大於SS
(512B),會發生什麼情況?它會將數據移動到L2並逐步將數據移動到L1嗎?它會使用其他套件嗎? - 如果L2(和L3就此而言)對於所有數據來說太小,該怎麼辦?
這和C++ 11有什麼關係? –
@BartekBanachewicz主要是因爲'alignas()'提供了簡單和標準化的對齊操作。當您開始對齊數據以優化緩存性能時,我認爲自然會要求緩存大對象的成本。 –
呃。這聽起來很像*過早的優化。 –