CPU L1-cache的false-sharing

本文探讨了多线程环境下L1-cache行冲突导致的性能损耗问题,通过实例解析了当两个线程分别访问相邻变量时,由于缓存行大小限制而引发的频繁缓存加载和失效现象。文章提出了通过增加Padding来避免缓存行冲突,从而提升多线程并发访问效率的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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失效;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值