0%

伪共享

伪共享

什么是伪共享?

CPU硬件访问内存通过Cache作为缓冲中介来加速访问, 而Cache与内存的一致性保证以Cache Line为最小单元进行操作, Cache又分级为1,2,3级缓冲, L1,L2是CPU独立的, L3是CPU共享的. Cache Line一般一行缓冲64B. 因此在并行执行场景下, 如果多个CPU同时访问Cache Line大小对应的内存数据区域, 即使它们访问的数据是不同的, 但是由于所访问的Cache Line是同一个, 也会导致数据脏, 从而使得Cache Line失效, 进而引起Cache Line的写回同步, 这种就是伪共享. (原本可能只需访问L1就可以的, 由于Cache Line失效, 数据需要同步会L3, 或重新从L3或内存中读取, 从而减慢了代码的执行速率).

换种说法是:
对缓存行中的单个变量进行修改了,导致整个缓存行数据也就失效了,并且,会导致其他CPU的含有被改动的共享变量的缓存行也失效了,就是所谓的伪共享问题。

引用Intel的说明:

为了保证多cache下数据一致性,Intel处理器(是多处理器架构)服从MESI(Modified/Exclusive/Shared/Invalid)协议【对cache line的状态标记,更多关于MESI的信息可以阅读参考链接2】。当cache line第一次加载进来之后,处理器将cache line标记为 Exclusive【Exclusive表示这行数据有效,数据和内存中的数据一致,数据只存在于本Cache中。】,只要这个cache line被标记为 Exclusive,后续的加载(subsequent loads【应该指读内存指令】)能够免费地(【无内存开销】)使用这个cache line中的数据。如果这个处理器在总线上看到这个cache line被其他处理器加载,这个处理器会将这个cache line标记为Shared【Shared表示这行数据有效,数据和内存中的数据一致,数据存在于很多Cache中】。如果这个处理器写(store【应该是指CPU写】)了一个标记为’S’【 Shared的缩写】的cache line,这个cache line被标记为 Modified【Modified表示这行数据有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中】,同时,这个处理器向所有其他处理器发送’Invalid’ cache line消息【因为该写操作导致其他CPU的cache中该数据失效】。如果处理器看到被标记为M的cache line被其他处理器访问,则这个处理器将该cache line写回主存,并将cache line标记为Shared【此时,所有其他CPU的后续访问该数据时,读到的是新的数据】,其他处理器访问这个cache line时,将会导致一个cache miss【它们要么是从未被加载到cache过,要么是从Shared状态变成了Invalid状态】。
当cache line被标记为Invalid时,处理器之间频繁地协调【应指通过MESI协议维护cache一致性】,导致cache line数据被写回内存并随后又加载到cache中。伪共享加剧了协调过程【应指伪共享情况下,协调发生得更频繁了】,并显著降低了应用程序性能。

避免伪共享的办法

  1. 使用线程局部数据拷贝, 编译器或手动将可能发生伪共享的连续存储改为线程/进程的本地数据, 线程局部数据拷贝能够被频繁读取和修改,并且只需将结果完全拷贝回去一次即可.
  2. 通过人为添加padding填充来以空间换时间, 使得可能同时被访问的数据不再同一个Cache Line中, 一般保证>64B.
    使用编译指示,来强制使每一个变量对齐。下面的代码显式了编译器使用__declspec( align(n) ) 此处n=64,按照cache line边界对齐。
    1
    2
    __declspec (align(64)) int thread1_global_variable;
    __declspec (align(64)) int thread2_global_variable;
    或者自己在数据结构的尾部填入padding, 或自己强制数组对齐到64B的倍数.

何时使用

一般为了避免伪共享带来的维护成本高收益低, 可忽略不处理, 只有在性能要求高的场景才需要考虑避免, 以空间的损失换来时间的降低.

参考:

  1. https://www.cnblogs.com/apprentice89/p/3347720.html
  2. https://www.cnblogs.com/cyfonly/p/5800758.html
  3. https://www.cnblogs.com/crazymakercircle/p/13909102.html