CPU Cache有L1/L2/L3 cache,它们是为了减缓CPU高速与Ram低速之间的数据运输成本的buffer
speed
L1: 4 CPU cycles
L2: 11 CPU cycles
L3: 39 CPU cycles
RAM: 107 CPU cycles
可见,越靠近CPU的cache,越快
size
L1: 64KB(数据32KB,指令32KB)
L2: 256KB
L3: 2MB
从size的数据可见,如果CPU访问RAM的热点 buf能够在L1全部装下,而且是乱序或者顺序访问,那么访问的数据都是L1的速度,以此类推L2,L3
例如L1 cache 32KB,一个整数4B,那么L1 cache可以容纳32KB/4B = 8192个整数
cache line size
CPU在加载内存时,是以cache line为单位的,而不是一个B一个B的加载,这样是为了更高的效率,当内存是临近访问时,这种设计变得尤为高效
cache line size是64B或者128B,当多线程访问时,这个size变得异常重要,如果两个线程共享了同一个cache line,会导致性能的下降
cache associativity
cache line与ram的地址关联是以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 %8 => 线性探索 64个格子 => 写入cache line
理解了hash结构,就可以在思考两个RAM地址是否会发生hash冲突了
如果在两个数据结构时,为了避免它们都放在1-way中,那么可以在它们的地址上做文章,利用hash函数的设计,让它们哈希到不通的way
例如一个ptr取余8是1,那么另外一个ptr可以设计为取余8是2
网友评论