首页 > 系统相关 >阅记-横向优化-底层架构-《HPC-一文彻底搞懂并发编程与内存屏障》

阅记-横向优化-底层架构-《HPC-一文彻底搞懂并发编程与内存屏障》

时间:2024-12-14 11:42:31浏览次数:3  
标签:顺序 架构 屏障 内存 HPC 搞懂 执行 阅记 乱序

目录

参考:HPC(高性能计算第一篇):一文彻底搞懂并发编程与内存屏障 [1] [2] [3]

Momory Ordering

memory barrier是memory乱序后产生的问题,和cpu架构强相关。
参考:Intel sdm手册 卷3A 多处理器管理,第二小节:内存顺序,专门讲述Memory barrier问题;

9.2.3.2 Neither Loads Nor Stores Are Reordered

9.2.3.2 节,是第一个关于内存顺序的例子

Q: 何为乱序?
A:

    1. 两个操作独立,互不依赖,多流水线架构下两条指令可以同时执行;
    1. 同时执行或者先后执行的情况下,也可能因为_y变量已经存在于cache中而先于_x执行
    1. intel cpu架构下,虽然2)执行乱序,但是到最后阶段(提交阶段吗?)又会顺序退出,即旁观者看来还是_x先执行完_y再执行完,所以intel的sdm手册这一小节的标题为Neither loads nor strores are reoredered,并描述r1 = 1 and r2 = 0 is not allowed,CPU使用一个叫内存排序区的部件,完成这种顺序性(待研究)
    1. 其他cpu架构,允许提交阶段乱序的话,那么P1就可能看到_y = 1 _x = 0的结果

Q: 对于4)怎么解决?

A:P0加上write_barrier, P1加上read_barrier(read同样可能乱序)


9.2.3.3 Stores Are Not Reordered With Earlier Loads

接下来的9.2.3.3 节描述了另外一种场景先有load操作再有store操作,这种场景下store操作也不会被reorder到load操作前


9.2.3.4 Loads May Be Reordered with Earlier Stores (intel x64架构下唯一会有memory reorder的情况)

9.2.3.4 读可以重排到写之前, intel x64架构下唯一会有memory reorder的情况

比如有种代码逻辑:1)mov _x,1 表示加本地的锁;2)mov r1, _y 表示检测其他线程当前是否有上锁;3)如果r1或者r2为0,表示其他线程没上锁,当前线程可以执行

正常顺序下,某一方赋值先执行,则另外一方读取肯定不为0,r1 r2可以是(1,1)(1,0)(0,1),但是同时为0不会发生,即P0 P1不会同时执行需要互斥的临界代码

有memory reorder下,read先于之前的write先执行,则r1 r2可能会同时为0,导致P0 P1同时执行需要互斥的临界代码
如果不想有这种乱序则需要上内存屏障

+++
内存屏障是内存顺序问题,即,内存操作本来是能分清先后顺序的,写先读后,但顺序被打乱了,读被提到前面了。如果不想打乱顺序,需要“屏障”,挡住后面的读,防止它提前执行、提前完成。
当程序逻辑依赖读写顺序,才需要使用内存屏障,如果程序逻辑并不依赖顺序,就让读被提前吧,这样对性能有帮助
(判断程序逻辑是否依赖顺序,有时候不是那么容易的)

内存屏障的实现

lock 和 mfence 指令

标签:顺序,架构,屏障,内存,HPC,搞懂,执行,阅记,乱序
From: https://www.cnblogs.com/stellar-liyanbin/p/17997924

相关文章

  • 一篇搞懂c指针
    1、int*p//定义一个指向整型的指针;2、void(*fun)(void);//定义一个函数指针fun(函数的参数为任意类型,返回值为任意类型)。指向函数的指针double*fun(double*p);//声明一个函数fun,函数参数为指向double的指针,函数的返回值也是指向double的指针。3、int(*num[10])(inta);//......
  • 【分布式系统】一文搞懂分布式服务发布和引用(Dubbo 案例解读)
    在分布式系统和微服务架构中,系统的能力来自服务与服务之间的交互和集成。为了实现这些过程,就需要服务提供者对外暴露可以访问的入口,而服务消费者就基于这些入口对服务提供者发起远程调用。我们来举一个例子,如果我们想要发布一个DemoService,那么可以使用这样的代码。DemoService......
  • 一篇文章搞懂什么叫电商API
    一、定义电商API(ElectronicCommerceApplicationProgrammingInterface),即电子商务应用程序编程接口,是电子商务平台提供给开发者和商家的一种技术接口,允许第三方应用程序访问和操作平台的数据和服务。二、功能商品管理:API支持商品的增删改查、价格调整、库存更新等操作,帮助......
  • 理解大小端问题:一文搞懂存储与顺序
    在计算机系统中,大小端问题(Endianness)是一个基础但重要的概念,它涉及多字节数据在内存中的存储顺序。本文将介绍大小端的定义、产生原因、应用场景,以及如何正确理解和使用它。1.什么是大小端?大端序(Big-Endian)在大端序存储方式中,数据的高字节(MostSignificantByte,MSB)存储在......
  • 【Linux内核】4张IO时序图,一次搞懂Linux下的文件读写
    因为如今大多数资源都是通过网络访问的:数据库、对象存储和其他微服务。大多数服务器应用程序开发人员在考虑I/O时,都会考虑网络I/O,然而,数据库开发人员还必须考虑文件I/O。一般来说,在Linux服务器上访问文件有四种选择:传统读/写、mmap、直接I/O(DIO)读/写和异步直接I/O(AIO/DIO)。......
  • 一片代码让你搞懂队列(用顺序表实现队列)
    基础数据结构---------队列将持续更新基础数据结构和算法用得到的零基础语法:类,数组,函数,初始化列表,构造函数,析构函数,标准输入输出流,指针,if-else语句,for循环,动态内存管理(堆区)#include<iostream>usingnamespacestd;#include<stdexcept>template<typenamet>classqueue{......
  • 一文搞懂SQL存储过程创建
    一文搞懂SQL存储过程创建......
  • 一文搞懂SQL触发器查看:从入门到精通,解锁数据库新技能
    一文搞懂SQL触发器查看......
  • 一文搞懂基于Raft算法的领头选举过程
    基于Raft算法的领头选举(LeaderElection)是Raft共识算法中确保分布式系统中只有一个领导者(Leader)的关键过程。以下是Raft算法中领头选举的详细介绍:节点状态:Raft算法中,节点可以处于三种状态:Follower、Candidate和Leader。Follower是普通节点,接收并处理来自Leader的消息;Candi......
  • HPC环境下仿真数据管理:数据安全与合规性指南!
    仿真数据在众多行业中有着广泛的应用场景,如何进行仿真数据管理,是企业需要解决的问题。以下是一些应用场景:1.航空航天飞行模拟与训练:利用仿真数据模拟真实的飞行环境和条件,进行飞行员的飞行训练,提高飞行技能和应对紧急情况的能力。航天器设计与测试:通过仿真数据模拟航天器的运行......