c++缓存优化

CPU缓存有多级缓存,比如L1, L2, L3等:

L1容量最小,速度最快,每个核都有L1缓存,L1又专门针对指令和数据分成L1d(数据缓存),L1i(指令缓存)。
L2容量比L1大,速度比L1慢,每个核都有L2缓存。
L3容量最大,速度最慢,多个核共享一个L3缓存。

c++缓存优化
在缓存和主存之间,数据是按固定大小的块传输的 该块称为缓存行(cache line)。
c++缓存优化
cpu从来都不直接访问内存, 都是通过cache间接访问内存,每次访问内存时先查看cache中是否有对应地址的数据,如果cache中没有则先分配一个cache entry,然后再把内存中的数据copy到刚刚分配的cache entry的cache line中,再从cache line中读取数据。

缓存性能的10种高级优化方法

c++缓存优化

多核CPU,每个核都拥有独立的L1/L2的缓存,而缓存按照最小单位缓存行进行和内存交互,缓存行一般为64字节。

可能优化的点

  1. 分块的大小与cpu cache line关系?

如果我们访问内存时,先把数据读取到CPU缓存cache line再计算,而下次读取到该数据时直接使用缓存(若未被淘汰掉),修改cpu cache line这个数值,数据字节对齐可能决定一次操作接触1个还是2个缓存行

  1. 避免伪共享的问题?

当多线程修改互相独立的变量(一般出现在全局变量或者一些动态申请的内存)时,如果这些变量共享同一个缓存行,那么当某个核修改缓存行某个变量值时,需要锁定缓存行,同时其他核已经加载该缓存行的cache也跟着失效,需要重新从内存读取。提到 cache line 往往会提到伪共享,也就是多核 CPU 的多线程编程中,每个线程虽然都访问自己本地的变量,没有使用任何线程同步锁,但由于这些变量在一个 cache line 上,也会造成 cache miss,导致性能严重下降。可以通过内存对齐使多线程之间不共享 cache line,以达到优化的目的。其中一个解决思路,就是让不同线程操作的对象处于不同的缓存行即可。

参考资料

参考资料1
资料2
资料3
伪共享资料4
cache性能优化总结
c/c++性能优化— cache优化的一点杂谈