loongarch架构介绍—内存模型和相关指令(二)

loongarch架构介绍—内存模型和相关指令(二),​想了解更多关于开源的内容,请访问:​,​​51CTO 开源基础软件社区​​,​​https://ost.51cto.com​​,前面一篇文章中介绍了loongarch架构中的基础部分,包括基础的整数运算指令、浮点运算指令、访存指令等,以及loongarch架构中的一些寄存器约定和汇编写法。,这篇文章则主要介绍loongarch架构中内存一致性模型相关信息,以及原子指令和栅障指令的含义和使用方法。本文会先介绍内存一致性模型相关背景知识,然后介绍目前loongarch资料中内存一致性模型相关的信息,再介绍loongarch中的原子指令和栅障指令,最后结合spinlock的实现说明原子指令和栅障指令的使用方法。,内存一致性模型(memory consistency model),简称内存模型(memory model),是描述程序的与shared memory相关的访存指令执行顺序行为的模型。对于一段程序,内存模型能够指出哪些访存指令执行顺序是cpu允许存在的,哪些执行顺序是不可能发生的。,对于一般应用程序的开发人员来说,内存一致性模型是透明的,代码看上去是顺序执行的,在多线程中通过调用系统封装的互斥锁等就可实现同步。,但对于系统开发人员,内存一致性模型需要了解,这关系到如底层汇编中自旋锁实现等应用场景。,这里列举出一些常见的内存一致性模型:,其中Load表示加载内存操作,Store表示写入内存操作。,除了SC模型外,其他几种都打乱了访存指令的执行顺序,这主要是硬件上性能因素的考虑。,下面对这些模型中定义的访存指令顺序进行介绍。,对于Load和Store操作,实际上总共有4种顺序:,SC模型保证以上所有的顺序,即访存指令实际的执行顺序与其在程序中的先后顺序相同。,下表为两个cpu核并行运行的例子:,其中,S1和S2为Store操作,L1和L2为Load操作,x和y是cpu核C1和C2中共享的变量,r1和r2是cpu核C1和C2中的局部变量。,SC中所有可能的执行顺序如下:,结果与一般程序员视角中的模型相同。,TSO中保证的访存指令顺序如下:,其中对于Store->Load可能会被打乱顺序。,下面用与上文SC中相同的例子进行说明:,TSO中所有可能的执行顺序如下:,可以看到,TSO中可以出现Load比Store先执行的情况,从而导致结果r1和r2均为0。,在RMO中允许更进一步的乱序执行,如只保证以下顺序:,由于如TSO、RMO等内存模型中访存指令的执行顺序不确定,因此硬件上提供了利用原子指令和栅障指令(称为fence或barrier等)来进行同步。程序中将需要同步的地方手动将其用原子指令和栅障指令进行标记,就能将目标代码同步。,下面用一个例子进行说明:,其中FENCE指令保证前后的访存指令顺序一致。最后访存指令的顺序为:S1,S2->F1->S3->L1->F2->L2,L3,结果(r1, r2, r3) = (SET, NEW, NEW)。,如果中间的FENCE指令去掉,那么可能会出现r2和r3为0的情况。,根据loongarch架构手册中相关信息,其采用弱一致性(Weakly Consistency)的模型。在该模型下,程序员必须通过同步指令将对写共享单元的访问保护起来,以保证多个处理器核对于写共享单元的访问是互斥的。,虽然目前的资料中无法得知loongarch内存一致性模型的具体信息,但可以推测其应该打乱了一些访存指令的顺序,需要借助栅障指令(即fence或barrier指令)进行同步。,loongarch架构下有三种内存访问类型:,例如,在页表项中的MAT(Memory Access Type)域中可以设置对应内存区域的访问类型。MAT值与内存访问类型的关系如下:,通过设置内存访问类型,相当于规定了一片内存区域的内存一致性模型。loongarch手册资料中指出,只有强序非缓存没有副作用,即不打乱访存指令的顺序。,不过loongarch资料中内存一致性模型和内存访问类型并没有详细解释,很多地方存在疑点,只能推测其作用类似于arm上的Normal、Device、Strongly-ordered几种内存模型。,loongarch中栅障指令如下:,loongarch中原子指令如下:,loongarch原子指令的特点与一些RISC架构的原子指令相似,也类似的用ll/sc这样的指令来代替了CAS(compare-and-swap)类型原子指令。ll/sc指令相比于CAS类指令,CAS指令实现锁时可能会有ABA问题,而使用ll/sc指令可以避免这个问题。,下面通过spinlock的实现,说明原子指令和栅障指令的应用。,作为对比,首先介绍linux3.2中arm下spinlock的实现。,lock操作函数如下:,unlock操作函数如下:,可以看到,arm中也有类似的原子指令和栅障指令。其中ldrex/strex指令类似于loongarch中的ll/sc指令。并且lock和unlock函数之后均有栅障指令进行同步。,类似地,loongarch中spinlock也可以仿照上述代码实现:,本文介绍了内存一致性模型、loongarch架构中内存一致性模型相关信息、原子指令和栅障指令的含义和使用方法,并结合自旋锁的案例进行了说明。同时发现,因为目前市场上得到的资料有限,loongarch架构内存一致性模型中还有一些不清楚的地方,需要后面相关厂家完善。,​想了解更多关于开源的内容,请访问:​,​​51CTO 开源基础软件社区​​,​​https://ost.51cto.com​

文章版权声明

 1 原创文章作者:cmcc,如若转载,请注明出处: https://www.52hwl.com/16998.html

 2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈

 3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)

 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023年3月5日 上午12:00
下一篇 2023年3月7日 下午10:34