FPGA開発日記

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

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

RISC-VにおけるRVWMOのメモリモデルについて、仕様書を読み直すことにした。

もうちょっと詳しく、RISC-V仕様書のAppendxx A. RVWMOの節を読み解いていくことにした。

msyksphinz.hatenablog.com


セクションA.3.8では、RISC-VのRVWMOメモリモデルにおける構文依存性について、規則9から11までが説明されている。 これらの規則は、特定のHART内でのロードから後続するメモリ操作への依存関係が尊重されることを示している。 現代のハードウェアやソフトウェアのメモリモデルでは、依存する命令のリオーダリングを許容することは混乱を招き易く直感に反するため、このような依存性の順序を強制することが一般的である。

  • 規則9: 構文的アドレス依存性 : ある操作bが、別の操作aに対して構文的アドレス依存性を持つ場合

  • 規則10: 構文的データ依存性 : ある操作bが、別の操作aに対して構文的データ依存性を持つ場合

  • 規則11: 構文的制御依存性 : 操作bがストアであり、別の操作aに対して構文的制御依存性を持つ場合

RVWMOメモリモデルは、構文的(文法的)依存性を使用し、命令間のレジスタの同一性に基づく定義に依存する。 これは、レジスタの実際の内容ではなく、アクセスされるレジスタの同一性に基づくものである。 これにより、計算が「最適化された」としても、アドレス、制御、またはデータ依存性が強制される必要がある。 この選択は、これらの偽の構文依存性を軽量な順序付けメカニズムとして使用するコードとの互換性を保証する。

例えば、図A.10では、最初の命令によって生成されたメモリ操作から、最後の命令によって生成されたメモリ操作への構文的アドレス依存性が存在する。 これは、a1 XOR a1がゼロであり、2番目のロードによってアクセスされるアドレスに影響を与えないにも関わらずである。

依存性を軽量な同期メカニズムとして使用する利点は、順序付けの要求が問題の2つの命令にのみ限定されることである。 他の非依存命令は、積極的な実装によって自由に再順序付けされる場合がある。 一つの代替手段は、Load Acquireを使用することだが、これは最初のロードに対してすべての後続の命令に対する順序付けを強制するものである。 もう一つの方法は、FENCE R,Rを使用することだが、これはすべての前のロードとすべての後のロードを含むため、より高価なオプションとなる。

制御依存性は、アドレス依存性やデータ依存性とは異なり、制御依存性が常にプログラム順序における元の対象の後に続くすべての命令に拡張されるという点で異なる。 成功したストア条件命令の出力から発生する依存性も、PPO規則9~11によって尊重されるよう意図的に設計されている。 これは、成功したSC命令によって生成されたストアが、ブランチの後に続くすべてのメモリ操作よりも後にグローバルメモリ順序に現れることを意味する。