FPGA開発日記

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

RISC-VにおけるRVWMOの仕様について読み直す (1. RVWMOの概要)

RISC-VにおけるRVWMOのメモリモデルについて、仕様書を読み直すことにした。 ChatGPTの力を借りながら、要点をまとめていく。


本章においては、RISC-Vのメモリ一貫性モデルに関する定義を述べる。

メモリ一貫性モデル: メモリのロードが返す値を規定する規則の集合。

RISC-Vは、「RVWMO」と称されるメモリモデルを採用し、これは高性能かつスケーラブルな設計を実現するための柔軟性と、容易に扱えるプログラミングモデルの双方を支持するために考案されたものである。

RVWMOでは、個々のHARTにおけるコードの実行は、同一HART内の他のメモリ命令から見た際には順序正しく行われているように見える。 異なるHARTからのメモリ命令は、第一のHARTのメモリ命令が異なる順序で実行されているように見えることがある。 故に、マルチスレッドコードにおいては、異なるハートからのメモリ命令間の順序を保証するために、明示的な同期が要求される場合がある。 この目的を達成するため、基本のRISC-V ISAは、セクション2.7に記載されるFENCE命令を提供する。 加えて、アトミック拡張「A」は、ロード予約/ストア条件付きおよびアトミックなRead-Modify-Write命令を定義する。

さらに、以下の追加規則はRVWMOに特有の拡張を提供する。

  • 非アラインドアトミック用の標準ISA拡張「Zam」(第22章)
  • 全ストア順序用の標準ISA拡張「Ztso」(第24章)

本章においては、通常の主記憶操作に適用されるメモリモデルに関する定義を述べる。 現段階において、メモリモデルと入出力メモリ、命令取得、FENCE.I、ページテーブルウォーク、並びにSFENCE.VMAとの関連性はまだ形式化されていない。 将来の仕様改訂に際して、前述の内容の一部または全部が形式化される可能性がある。

また、RV128 BASE ISA及び将来予定されているISA拡張――例えば、「V」ベクトル拡張や「J」JIT拡張など――も、今後の改訂版に取り込む必要がある。

異なる幅を持つメモリアクセスが同時に重複する状況を扱うメモリ一貫性モデルは、現在も学術的な研究の活発な領域にあり、その全容はまだ完全には把握されていない。 RVWMOの下で、異なるサイズのメモリアクセスがどのように相互作用するかの詳細は、我々の現在の能力に基づいて特定されているが、新たに発見された問題に応じて、その内容は改訂されることが予想される。

16.1 RVWMOメモリモデルの定義

RVWMOメモリモデルは、全HARTにより生成されるメモリ操作のグローバルメモリ順序の概念に基づき定められる。 マルチスレッドプログラムは多数の可能な実行プログラムを持ち、各実行は固有のグローバルメモリ順序を持っている。

グローバルメモリ順序は、メモリ命令によって生成される基本的なロードおよびストア操作に関して定義され、以降で定義される制約を受ける。 メモリモデルの全ての制約を満たす実行は、メモリモデルの観点から合法的な実行とされる。

  • メモリモデルプリミティブ:
    • メモリ操作に対するプログラム順序は、それぞれのHARTの動的命令ストリームにおける、ロードおよびストアを生成する命令の論理的配置を反映する。言い換えれば、単純なインオーダープロセッサがそのハートの命令を実行する順序を意味する。
    • メモリアクセス命令からはメモリ操作が生じる。メモリ操作は、ロード操作、ストア操作、または両方同時になり得る。全てのメモリ操作はシングルコピーアトミックであり、部分的に完了した状態で観測されることはない

RV32GCおよびRV64GCの命令では、整列されたメモリ命令は、2つの例外を除き、正確に1つのメモリ操作を生じる。

  • 成功しないSC命令はメモリ操作を引き起こさない。
  • XLEN<64の場合、FLDおよびFSD命令は、セクション13.3で述べられ、以下で明確化されるように、複数のメモリ操作を引き起こす可能性がある。
  • Aligned AMOは、ロード操作およびストア操作の両方である単一のメモリ操作を引き起こす。

RV128基本命令セットおよび将来のISA拡張(例えば、V(ベクトル)やP(SIMD))の命令は、複数のメモリ操作を生じる可能性があるが、これらの拡張のメモリモデルはまだ形式化されていない。

Misaligned LoadまたはStore命令は、任意の粒度の一連のコンポーネントメモリ操作に分解され得る。 XLEN<64のFLDまたはFSD命令も、任意の粒度の一連のコンポーネントメモリ操作に分解され得る。 このような命令によって生成されるメモリ操作は、プログラム順序において互いに対して順序付けられていないが、プログラム順序における先行および後続の命令によって生成されるメモリ操作に対しては通常通り順序付けられる。 アトミック拡張「A」は、Misaligned アトミック命令を全くサポートする必要はないが「Zam」拡張を通じてMisalignedアトミックがサポートされている場合、LR、SCおよびAMOは、Misalignedアトミックに関する原子性公理の制約を受けて分解される可能性がある(第22章で定義される)。

Misalignedメモリ操作をバイト粒度まで分解することは、Misalignedアクセスをネイティブにサポートしていない実装においてエミュレーションを容易にする。 例えば、そうした実装はMisalignedアクセスのバイトを一つずつ反復処理するだけで済む場合がある。