CPU Cache有L1/L2/L3 cache凶掰,它們是為了減緩CPU高速與Ram低速之間的數(shù)據(jù)運輸成本的buffer
speed
L1: 4 CPU cycles
L2: 11 CPU cycles
L3: 39 CPU cycles
RAM: 107 CPU cycles
可見钝鸽,越靠近CPU的cache解滓,越快
size
L1: 64KB(數(shù)據(jù)32KB狠怨,指令32KB)
L2: 256KB
L3: 2MB
從size的數(shù)據(jù)可見食店,如果CPU訪問RAM的熱點 buf能夠在L1全部裝下,而且是亂序或者順序訪問梢灭,那么訪問的數(shù)據(jù)都是L1的速度饼灿,以此類推L2,L3
例如L1 cache 32KB幕侠,一個整數(shù)4B,那么L1 cache可以容納32KB/4B = 8192個整數(shù)
cache line size
CPU在加載內存時碍彭,是以cache line為單位的晤硕,而不是一個B一個B的加載,這樣是為了更高的效率庇忌,當內存是臨近訪問時舞箍,這種設計變得尤為高效
cache line size是64B或者128B,當多線程訪問時皆疹,這個size變得異常重要疏橄,如果兩個線程共享了同一個cache line,會導致性能的下降
cache associativity
cache line與ram的地址關聯(lián)是以hash來維護的
通過mod和N-way沖突來維護hash
例如L1 cache略就,把cache分成8-way捎迫,
L1 cache 32KB/64B = 512 cache line
1-way 512/8 = 64 cache line = 64*64B = 4096 B
RAM -> cache : (addr&(64*64 - 1)) %64 => 用低6位來做offset => 寫入cache line
理解了hash結構,就可以在思考兩個RAM地址是否會發(fā)生hash沖突了
如果在兩個數(shù)據(jù)結構時表牢,為了避免它們都放在1-way中窄绒,那么可以在它們的地址上做文章,利用hash函數(shù)的設計崔兴,讓它們哈希到不通的way