局部性原理和伪共享

CPU Cache

CPU Cache可以理解为CPU内部的高速缓存。CPU从内存读取数据时,将要读取的数据及其相邻地址的数据,即至少一个Cache Line,写入Cache,以便后续访问时提高读取速度。

CPU存在多级Cache,级别最高的离CPU最近,访问速度最快容量最小,之后容量逐步增长、速度逐步下降,但它们的访问速度依然要比内存块。每级Cache所存储的全部数据,都是下一级Cache的一部分。

Cache Line称为缓存行,可以理解为CPU Cache中的最小缓存单位。内存与Cache、多级Cache之间的数据传输不是以字节为最小单位,而是以Cache Line为最小单位。目前主流的Cache Line大小都是64字节。

在多核环境下,多个CPU对同一块内存同时读写,就会引起冲突的问题,被称为Cache一致性问题。例如,两个CPU都读取了内存中的某一数据,该数据和相邻数据就会分别写入两个CPU的Cache中,此时CPU1修改了该数据,则会写入自己的Cache,并不会回写内存,CPU2将无法读到新的数据。于是有了MESI协议:当CPU1修改了Cache中的某数据时,其它CPU都会收到通知,它们的相应Cache Line就被置为无效状态,当其它CPU需要访问此数据时,发现自己的Cache Line数据已失效,这是CPU1会立即把数据写到内存中,其它CPU就会立即从内存中读取该数据。

Cache使用LRU作为替换策略,即选择未使用时间最长的替换。

局部性原理

程序局部性原理:是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。相应地,执行所访问的存储空间也局限于某个内存区域,具体来说,局部性通常有两种形式:时间局部性和空间局部性。

时间局部性:被CPU访问的数据,短期内还要被继续访问,比如循环、递归、方法反复调用等。

空间局部性:被CPU访问的数据的相邻数据,短期内还要被继续访问,比如顺序执行的代码、连续创建的对象、数组等。

const int row = 1024;
const int col = 1024;
int matrix[row][col];
int sum;//按行遍历
for (int r=0; r<row; r++) {for (int c=0; c<col; c++) {sum += matrix[r][c];}
}//按列遍历
for (int c=0; c<col; c++) {for (int r=0; r<row; r++) {sum += matrix[r][c];}
}

根据空间局部性原理,访问内存时会把相邻的数据也加载到Cache中,下次访问相邻数据时Cache的命中率极高,速度自然提升不少。

伪共享False Sharing

Cache系统中是以Cache Line作为存储单位的,当多CPU各自的线程修改相互独立的变量时,如果这些变量恰好在同一个Cache Line中,由于多核间的Cache一致性协议,会导致Cache Line在多核间同步,如此影响了运行效率,这就是伪共享。

struct s {int a;int b;
}

比如上面这个结构体,线程1读写a,线程2读写b,那么两个线程就有机会在不同的核,于是产生Cache Line同步行为来回颠簸。但是,如果把a和b之间padding一些区域,让它们处在不同的Cache Line,就可以互不影响了。

struct s {int a;char padding[cacheline_size - sizeof(int)];int b;
}

除此之外,可以在结构体尾部填充padding,以使本结构体数据在一个独立Cache Line。

另外一种技术是使用编译指示,来强制使变量对齐。代码显式声明编译器使用__declspec( align(n) ), 此处 n=64,按照 cache line 边界对齐。

__declspec (align(64)) int thread1_global_variable;
__declspec (align(64)) int thread2_global_variable;

那么,在实际的生产开发过程中,我们一定要通过缓存行填充去解决掉潜在的伪共享问题吗?

其实并不一定。首先,我们暂时无法从系统层面上通过工具来探测伪共享事件。其次,不同类型的计算机具有不同的微架构,如果涉及到跨平台,那就更难以把握了。一个确切的填充方案只适用于一个特定的操作系统。还有,缓存的资源是有限的,如果填充会浪费珍贵的 cache 资源,并不适合大范围应用。最后,目前主流的 Intel 微架构 CPU 的 L1 缓存,已能够达到 80% 以上的命中率。

综上所述,并不是每个系统都适合花大量精力去解决潜在的伪共享问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/227856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

别太担心,人类只是把一小部分理性和感性放到了AI里

尽管人工智能&#xff08;AI&#xff09;在许多方面已经取得了重大进展&#xff0c;但它仍然无法完全复制人类的理性和感性。AI目前主要侧重于处理逻辑和分析任务&#xff0c;而人类则具有更复杂的思维能力和情感经验。 人类已经成功地将一些可以数据化和程序化的理性和感性特征…

不同路径(力扣LeetCode)动态规划

不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

python基于YOLOv8全系列模型【n/s/m/l/x】开发构建不同参数量级的钢铁产业产品智能自动化检测识别系统

在前文的项目开发实践中&#xff0c;我们已经以钢铁产业产品缺陷检测数据场景为基准&#xff0c;陆续开发构建了多款目标检测模型&#xff0c;感兴趣的话可以自行阅读即可。 《YOLOv3老矣尚能战否&#xff1f;基于YOLOv3开发构建建钢铁产业产品智能自动化检测识别系统&#xf…

JavaWeb后端数据库MySQL的使用

JavaWeb MySQLSQL数据库设计 多表设计1对多1对1多对多 多表查询连接查询内连接外连接左外连接右外连接 子查询事务索引 MySQL MySQL数据模型 关系型数据库&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 SQL SQL&#xff1a;操作关系型数…

【LeetCode刷题-链表】--86.分隔链表

86.分隔链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }* }*/ class…

孔明棋,(n + 2) x (m + 2)的棋盘,中间n x m的区域都是棋子,求最后最少剩余几个棋子

题目 #include <iostream> using namespace std; int f(int n, int m) {int t, res;if (n > m){t n;n m;m t;}if (n 1)res (m 1) / 2;else if (n 2){if (m % 3 0)res 2;elseres 1;}else if (n 3){res 2;}return res; } int change(int x) {x % 3;if (x 0…

sprintboot快速初始化【Springboot】

1.首先选择创建项目 2.填写对应的项目信息 一定要勾选maven&#xff0c;否则没有pom文件&#xff0c;选择next 3.选择应用场景 点击 create&#xff0c;DIEA就会根据你的选择自动创建项目骨架&#xff1b; 4.创建一个控制层 随便创建一个控制层&#xff0c;测试一下项目是否…

python实现C++简易自动压行

突发奇想&#xff0c;想要将自己的c压行之后交上去。但是苦于手动压行效率太低&#xff0c;在网上搜索压行网站没有找到&#xff0c;突然发现压行不就是检查检查去个换行符吗。于是心血来潮&#xff0c;用python实现了一个简易压行程序。 首先&#xff0c;宏定义等带#的文件不…

iconfont 使用彩色图标

1、下载iconfont到本地 2、全局安装 iconfont-tools npm install -g iconfont-tools 3、在iconfont解压目录下执行命令、一直回车 iconfont-tools 4、文件拷贝 执行完上述命令后会生成iconfont-weapp目录&#xff0c;将iconfont-weapp目录下的iconfont-weapp- icon.css文件…

ubuntu改window任务栏

经常在ubuntu和win之间切换&#xff0c;任务栏的布局不统一会让人很别扭&#xff0c;个人很喜欢win任务栏的不折叠图标功能&#xff0c;而ubuntu没有&#xff0c;又很喜欢的ubuntu的多工作空间&#xff0c;效率比副屏还高&#xff0c;还可以自定义切换工作空间的快捷键。鱼和熊…

成功的蓝图:实现长期成长与卓越表现的 6 项策略

能在收入和利润上持续领先同行的公司寥寥无几&#xff0c;不到四分之一。McKinsey的最新研究揭示了这些增长标杆公司与众不同的六大心态和策略。过度谨慎的公司&#xff0c;尤其在动荡时期&#xff0c;也许能捱过当下&#xff0c;但往往无法发掘全部潜力。考虑到近五年历经前所…

Ps:子路径的上下排列以及对齐与分布

不论是一个形状图层&#xff08;或图层的矢量蒙版&#xff09;上的多个形状还是同一路径层上多个路径&#xff0c;只要对应“路径”面板的一个路径层&#xff0c;可以将这些路径称为该路径层的“子路径”&#xff0c;也称为“组件”。 当一个路径层上有两个以上的子路径时&…