L1-cache加载和失效的单位是64字节;
所以2个变量挨着放,线程1和线程2虽然两者访问的是不同地址的变量(至少有一个线程在写入),也会导致2个L1-cache该行不停的失效,不停的加载内存进L1-cache,导致速度损失。
解决方法:加padding,让不同线程访问的2个变量离得远些,不在同一cache行。
挨着和不挨着,人家测的性能对比,损失和线程个数基本成倍数:
例:
struct { int x; int y; };
1. 线程X读x;x和y被加载至同一个cache行;
2. 线程Y读y;复用该cache,不用读主存;
3. 线程X写x;写入内存,该cache行失效(每行有一个dirty-bit)
4. 线程Y读y; 发现该cache行已失效,则读内存并加载至cache,超慢;
5. 3和4反复进行,则无辜的线程Y本来可以享受只读数据放cache的快速,但受了x老被写入带来的cache-dirty失效;