加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
    • 1、前言
    • 2、TSO操作映射
    • 3、Power操作映射
    • 4、Arm操作映射
    • 5、Linux操作映射
    • 6、C语言映射
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

RISC-V笔记——代码移植指南

10/28 08:35
2019
阅读需 8 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

1、前言

本文记录一些RISC-V内存操作在不同平台、场景下的使用方式,方便代码在不同平台上的移植。

2、TSO操作映射

表1提供了从TSO内存操作到RISC-V内存指令的映射。

表1 从TSO操作到RISC-V操作的映射

正常的x86 load和store都是默认带有acquire-RCpc和release-RCpc操作:TSO默认执行所有的load-load、load-store和store-store排序。因此,在RVWMO下,所有TSO load必须映射到load + FENCE R,RW,所有TSO store必须映射到FENCE RW,W + store。

TSO原子读-修改-写和使用LOCK前缀的x86指令是完全有序的,可以通过同时具有aq和rl集的AMO实现,也可以通过具有aq集的LR + 算术运算 + 具有aq和rl集的SC以及检查成功条件的条件分支来实现。在后一种情况下,LR上的rl注释(由于不明显的原因)是冗余的,可以省略。

TSO store可以通过rl集映射到AMOSWAP。然而,由于RVWMO PPO规则3禁止将AMOs的值转发给后续load,因此将AMOs用于store可能会对性能产生负面影响。TSO load可以使用带有aq集的LR进行映射:所有这样的LR指令都是不配对的,但这一事实本身并不排除对load使用LR。但是,如果这种映射对保留机制施加的压力超过了最初的预期,那么它也可能对性能产生负面影响。

3、Power操作映射

表2提供了从Power内存操作到RISC-V内存指令的映射。Power ISYNC在RISC-V上映射到FENCE.I + FENCE R,R;后面的FNECE是必需的,因为ISYNC用于定义RVWMO中不存在的“控制+控制FENCE”依赖关系。

表2 从Power操作到RISC-V操作的映射

4、Arm操作映射

表3提供了从ARM内存操作到RISC-V内存指令的映射。由于RISC-V目前没有自带aq或rl语义的普通load和store指令,ARM的load acquire和store release指令在RISC-V中用FENCE来映射。此外,为了确保store-release-to-load-acquire的顺序,在store release和load acquire之间必须要有一个FENCE RW,RW。表3通过始终在每个acquire操作前防止FENCE指令来强制保证这一点。ARM的load-exclusive和store-exclusive指令通用可以映射到RISC-V上的LR和SC指令。但这里不需要把FENCE RW,RW放到带aq的LR指令前面,而是直接使用aqrl。ARM ISB在RISC-V上映射到FENCE.I且后面跟着FENCE R,R指令。类似于ISYNC映射到Power的方式。不过ARM DSB如何映射到RISC-V上,这一点我暂时也没想明白。

表3 从ARM操作到RISC-V操作的映射

5、Linux操作映射

表4提供了linux内存排序宏到RISC-V内存指令的映射。因为RISC-V Unix平台需要一致的DMA,所以Linux的dma_rmb()和dma_wmb()分别映射到FENCE R,R和FENCE W,W。但如果在非一致的DMA平台上,它们分别需要映射到FENCE RI,RI和FENCE WO,WO。具有非一致的DMA的平台可能还需要一种机制,通过该机制可以使cache line失效,这些机制将是特定于设备或在ISA的未来扩展中。

表4 从Linux内存原语到RISC-V原语的映射

6、C语言映射

表5提供了C11/C++11原子操作到RISC-V内存指令的映射。如果引入了带有aq和rl语义的load和store,那可以使用表6的映射。但是要注意的是,只有当atomic_(memory_order_seq_cst)使用集带有aq和rl的LR进行映射时,这两个映射才能正确互相操作。更重要的是,除非通过添加第二个FENCE或映射store为amoswap.rl来加强表5的store映射,不然表5的store和表6的load可以重新排序。

表5 从C/C++原语到RISC-V原语的映射

表6 如果引入load-acquire和store-release操作,从C/C++原语到RISC-V原语的映射

任何AMO操作都可以用LR/SC对来模拟,但必须注意确保任何源自LR的PPO顺序也源自SC,并且任何终止于SC的PPO顺序也终止于LR。例如,考虑到load操作没有任何数据依赖关系的概念,还必须使LR遵循AMO拥有的任何数据依赖关系。同样,在同一个hart的其它地方FENCE R,R的效果也必须适用于SC,否则SC不会遵守该FENCE的顺序。不过仿真器可能可以通过简单地将AMO操作映射到lr.aq和sc,acrl来实现全有序原子操作的效果。

这些C11/C++11映射要求平台为所有内存提供以下物理内存属性(PMA, Physical Memory Attributes):

main memory

coherent

AMO Arithmetic

RsrvEventual

不过不同属性的平台可能需要不同的映射或者需要特定于平台的软件,例如Memory-mapped I/O。

相关推荐

电子产业图谱

分享Arm architecture, AMBA, 芯片验证, 脚本, EDA, Linux等知识。

微信公众号