FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

RISC-VにおけるFENCE命令の詳細について

RISC-Vにおけるメモリアクセスのフェンス命令は、以下のFENCE命令が定義されている。

基本的には、FENCE命令の前後におけるメモリアクセスの順序を強制するというのがこの命令の目的なのだが、オプションを見てわかる通りもう少し細かな制御ができる。

  • predecessor : FENCE命令よりも前にあるメモリアクセス命令の実行順序を制御する
  • successor : FENCE命令よりも後にあるメモリアクセス命令の実行順序を制御する

それぞれについて、4つのオプションがある:

  • I : Input (デバイス領域の入力(ロード))
  • O : Output (デバイス領域への出力(ストア))
  • R : Read (メモリ領域の入力(ロード))
  • W : Write (メモリ領域の出力(ストア))

したがって、合計で8つの順序制御のオプションが存在することになる:"PI" / "PO" / "PR" / "PW" / "SI" / "SO" / "SR" / "SW" である。

これらをまとめて、メモリアクセス命令のニーモニックは例えばFENCE R, RWのような書き方をする。 これはPredecessor側のメモリアクセスのReadはFENCEに対して順序が強制され(つまりFENCEよりも前のメモリアクセス命令はFENCEよりも前に実行されている必要がある)、Sucessor側のメモリアクセスのRead/WriteはFENCEに対して順序が強制される(つまりFENCEよりも後のメモリアクセス命令はFENCEよりも後に実行される必要がある)。

逆に言えば、FENCE R,RWではPredecessor側のメモリへのWrite操作は順序が強制されず、FENCEの実行よりも後に実行されても構わない。

さらに、FENCEのオプションとしてTSOモードというものが存在している。 TSO(Total Store Ordering)では、順序の強制はPredecessorでRW、SuccessorでRWと扱われるので、すべてのメモリアクセスは順序を入れ替えて実行することができない(メモリアクセスのインオーダ実行に近いイメージだが、別々のアドレスに対するアウト・オブ・オーダ実行を禁止するものではない(あくまでFENCEはユーザからの見え方の問題だという理解)なので)。

ただし実際の実装ではFENCE命令を実行するとどのような順序オプションでも、FENCEの前後の命令は順序をかなりはっきりと強制して動作するような気がしている。