首页 / MESI缓存一致性协议详解
存储器分成几个级别
Register, L1 Cache, L2 Cache, L3 Cache, Memory, SSD or HDD
L1P for program (sometimes L1I for L1 instruction)
L1D for data
L2 Cache is per CPU core (private)
L3 Cache is shared among core (public)
Bus
Memory 16GB
J4105
https://www.cpu-world.com/CPUs/Celeron/Intel-Celeron%20J4105.html
L1$ 256 KiB
L1I$ 128 KiB 4x32 KiB 8-way set associative
L1D$ 96 KiB 4x24 KiB 6-way set associative write-back
L2$ 4 MiB 1x4 MiB 16-way set associative write-back
Problem
If both core execute x=x+1, its private L1D data is not visible to other. Parallel computing causes x==1 not x==2.
Solution 1
给bus总线加锁,谁访问内存的数据,就给bus加上lock,这个时候不处理完谁也不能加载和改变内存的数据,也就会导致cpu间的阻塞。这个问题可以解决但是性能太低了。
Solution 2
MESI 缓存一致性协议了。他是对单个缓存行来进行加锁,不会影响内存中其他的数据的读写操作。
MESI
分别是M(modified)、E(exclusive)、S(shared)、I(invalid)。
M(修改):该Cache line有效,数据被修改了和内存中的数据不一致,但是仅存在本cache中。
E(独享):该Cache line有效,数据和内存一致,仅存在本cache中。
S(共享):该Cache line有效,数据存在多个缓存中。
I(无效):该Cache line无效。
四个状态,所以每个缓存行都有2个bit来进行表示当前Cache line的状态。
CPU缓存行
最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。
缓存是由缓存行组成的,通常是64字节,可以存8个long类型的变量。
Why Array? 得到免费缓存加载所带来的优势
请记住我们必须以整个缓存行作为单位来处理(译注:这是CPU的实现所规定的
Read
2. https://blog.csdn.net/qq_27680317/article/details/78486220
TBC since 2022-07-20
1. LINUX KERNEL MEMORY BARRIERS Hard, not yet read all. https://www.kernel.org/doc/Documentation/memory-barriers.txt
More
End
沒有留言:
張貼留言