RISC-VにおけるRVWMOのメモリモデルについて、仕様書を読み直すことにした。 ChatGPTの力を借りながら、要点をまとめていく。
保存されたプログラム順序
プログラムの任意の実行におけるグローバルメモリのアクセス順序は、各HARTのプログラム順序の一部を尊重するが、全てを尊重するわけではない。
- 保存されたプログラム順序 : グローバルメモリ順序によって尊重されなければならないプログラム順序のサブセット。
逆に考えると、独立したメモリ操作や、互いに独立した命令間では、その順序を保持する必要はない。厳密に順序を守らなければならないのは以下のルールに従う:
メモリ操作
a
がプログラム順序でメモリ操作b
より先行し、a
とb
が共に通常のメイン・メモリにアクセスする(I/O領域ではない)場合、そして以下のいずれかが当てはまる場合、保存されたプログラム順序(そしてグローバル・メモリ順序でも)においてa
はb
より先行する:重複アドレス順序:
b
がストア命令であり、a
とb
が重複するメモリアドレスにアクセスする。a
とb
がロード命令であり、x
はa
とb
の両方によって読まれるバイトであり、a
とb
の間のプログラム順序でx
に対するストアがなく、a
とb
はx
に対して異なるメモリ操作によって書かれた値を返す。a
はAMOまたはSC命令によって生成され、b
はロードであり、b
はa
によって書かれた値を返す。明示的同期:
a
の前にb
を順序付けるFENCE命令が挿入されているa
にはacquire注釈が付いている。b
にはrelease注釈が付いている。a
とb
の両方にRCsc注釈が付いている。aはbとペアになっている。
構文依存性:
b
にはa
に対する構文アドレス依存性がある。b
にはa
に対する構文データ依存性がある。b
はストアであり、b
にはa
に対する構文制御依存性がある。パイプライン依存性:
b
はロードであり、a
とb
の間のプログラム順序で、m
がa
に対するアドレスまたはデータ依存性を持ち、b
がm
によって書かれた値を返すようなストアm
が存在する。b
はストアであり、a
とb
の間のプログラム順序で、m
がa
に対するアドレス依存性を持つような何らかの命令m
が存在する。
メモリモデルの公理
RISC-Vプログラムの実行がRVWMOメモリ一貫性モデルに従うためには、保存プログラム順序に従い、ロード値公理、原子性公理、および進行公理を満たすグローバルメモリ順序が存在しなければならない。
ロード値公理
各ロードi
の各バイトは、以下のストアの中でグローバルメモリ順序において最後のものによってそのバイトに書き込まれた値を返す必要がある:
1. そのバイトに書き込み、グローバルメモリ順序でi
より先行するストア。
2. そのバイトに書き込み、プログラム順序でi
より先行するストア。
(つまり、メモリからの読み込みがどのように最新のデータを反映するかを規定する)
原子性公理
もしr
とw
が、HART hにおいてAlignedなLRとSC命令によって生成されるペアのロードおよびストア操作であり、s
がバイトx
へのストアで、r
がs
によって書かれた値を返す場合、s
はグローバルメモリ順序でw
より先行しなければならず、s
の後でかつw
の前に、h以外のHARTからのバイトx
へのストアはグローバルメモリ順序において存在してはならない。
(つまり、特定の命令ペアが適切に連携して動作することを保証する)
原子性公理は理論上、異なる幅のLR/SCペアや一致しないアドレスへのペアに対応していますが、実装はそのような場合にSC操作が成功することを許可するためである。 しかしながら、実際にはそのようなパターンは稀であり、その使用は推奨されていない。
進行公理
グローバルメモリ順序で、無限の他のメモリ操作のシーケンスによって先行されるメモリ操作は存在してはならない。 (つまり、メモリがデッドロックに陥らないことを保証するための公理)。