ARM系列 -- 内存屏障

在开始学习ARM内存屏障(memory barrier)指令前,需要想了解几个相关的概念:内存模型(memory model),内存类型(memory type),内存属性(memory attribute)。

关于这几个概念,前面的文章讲过。为了保持本篇的内容完整性,今天再重复一遍。

第一个是内存模型,有的翻译成存储模型。Armv8-A采用的是弱序内存模型(weakly ordered model of memory),也就是说实际的内存访问顺序可能与程序的load/strore操作顺序不完全一致。为什么实际访问顺序与程序顺序不一致呢?或者换一种问法,能不能让二者的顺序一致呢?答案是可以,但是处理器会有性能损失。如果让两者的顺序完全一致,就是强序内存模型,也称为顺序一致性模型。在此模型下,load/store操作是顺序的访问存储器。处理器都按照程序顺序来执行程序,即便访问的是不同内存地址,也不能改变访问顺序。从全局看,每个内存写操作都需要能被系统中所有的处理器同时观测到,同一时刻只有一个处理器和内存系统相连,因此对内存的访问是原子化的,串行化的。但这里有一个问题,处理器只有在一个操作完成后才能执行下一个操作。我们知道,现代高性能处理器的主频很高,芯片的内存速度远远落后于处理器速度,如果处理器发起下一个访存操作前必须等在上一个访存操作完成,那么必然造成处理器停顿(CPU stall),处理器的性能将会被大大影响。

弱序内存模型对于访存顺序的要求不像顺序模型那么严格,只要同步访问之间的次序得到保证,load和store指令的执行就可以改变次序或相互叠加,无需原子性的执行这些指令。换句话说,处理器可以按照一定规则对访存指令进行重新排序。

目前,高性能处理器可以支持推测性内存读取(speculative memory read)、指令多发射(multiple issuing of instruction),乱序执行(out-of-order execution)等多种技术。这些技术与其它技术一起,为访存的硬件重新排序提供了进一步的可能性:

指令多发射:处理器可以在每个时钟周期发出和执行多条指令。一些指令可以并行到达流水线的执行阶段,因此这些指令的执行顺序可能会以与程序中的顺序不同。

乱序执行:此技术允许处理器可以乱序的执行非相关(依赖)的指令,一些指令可能因为某些原因暂时停留在执行阶段,但这些指令不会阻止其它的非相关指令完成。

推测:处理器在执行条件指令(例如分支指令)时,可以根据一定的规则进行推测,尽可能早的装入指令,也就是尽量填充流水线,这样处理器就不会空闲着。

load/store优化:处理器为了减少访存次数,可以把多个访存操作合并成一笔操作。

编译器优化:优化编译器可以对指令重新排序,以隐藏延迟或充分利用硬件功能。在单核系统中,这种重新排序的影响对程序员来说是透明的,因为单个处理器可以检查并确保指令的依赖性,避免竞争现象。但是在多核系统中,处理器核之间共享存储,共享数据,目前编译器没有办法知道处理器核之间的依赖关系。

综上,内存一致性模型用于定义系统中对内存访问需要遵守的原则,在高性能处理器设计需要慎重考虑。内存一致性问题不同于缓存一致性,虽然缓存一致性会加重内存一致性的难度。换句话说,即使关闭高性能处理器中的缓存,内存一致性问题依然存在。

第二个概念,内存类型。Armv8-A架构定义了两种互斥的内存类型,普通型(normal)和设备型(device),所有的内存区域都配置为这两种类型中的一种。

普通型内存:

普通型内存主要包括RAM,ROM,Flash等。普通型内存是弱序的,允许编译器进行更多的优化,以支持高性能处理器。处理器可以推测性的访问标记为普通型的存储地址,以便可以从中读取数据或指令,而无需在程序中显式引用。为了获得最佳性能,需要将应用程序的代码和数据标记放在普通型内存中。如果需要严格的内存访问顺序,即在需要强制排序的情况下,可以通过使用显式屏障操作来实现。

处理器必须始终负责由地址依赖性引起的危险:

STR X0, [X2]

LDR X1, [X2]

这个例子中,第一条指令的意思是把X0寄存器中的值写入(store)到以X2寄存器的值为地址的存储位置;第二条指令是把X2寄存器的值为地址的数据加载(load)到X1处理器中,两条指令执行完的效果是把X0的值写到外部存储(地址保存在X2中),并且把这个值赋给X1。由于这两条指令都以X2寄存器的值

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值