fence

fence

RISC-V アセンブリ 参考

lyszt.netはfenceおよびその他のRISC-V命令をより詳しく扱っています。

説明

FENCE命令は、他のRISC-Vハートや外部デバイスまたはコプロセッサから見たデバイスI/Oおよびメモリアクセスの順序付けに使用されます。デバイス入力(I)、デバイス出力(O)、メモリ読み出し(R)、メモリ書き込み(W)の任意の組み合わせを、同じ組み合わせの任意の組み合わせに対して順序付けることができます。非公式には、他のRISC-Vハートや外部デバイスは、FENCEに先行するpredecessorセット内の任意の操作の後に、FENCEに後続するsuccessorセット内の任意の操作を観測することはできません。memorymodelは、RISC-Vメモリ一貫性モデルの正確な記述を提供します。

FENCE命令はまた、外部デバイスによるメモリ読み出しおよび書き込みによって観測される、ハートによるメモリ読み出しおよび書き込みの順序も付けます。ただし、FENCE命令は、他のシグナリング機構を使用して外部デバイスが行うイベントの観測を順序付けません。

ℹ
デバイスは、何らかの外部通信機構を介してメモリ位置へのアクセスを観測する場合があります。例えば、割り込みコントローラに割り込み信号を送るメモリマップド制御レジスタなどです。この通信はFENCE順序付け機構の範囲外であるため、FENCE命令は、割り込み信号の変化が割り込みコントローラにいつ可視になるかについて保証を提供できません。特定のデバイスは、ソフトウェアのオーバーヘッドを削減するために追加の順序付け保証を提供する場合がありますが、それらはRISC-Vメモリモデルの範囲外です。

EEIは、どのI/O操作が可能か、特に、ロード命令およびストア命令によってアクセスされたときにどのメモリアドレスがメモリ読み出しおよび書き込みではなくそれぞれデバイス入力およびデバイス出力操作として扱われ順序付けられるかを定義します。例えば、メモリマップドI/Oデバイスは通常、RビットおよびWビットではなくIビットおよびOビットを使用して順序付けられる、キャッシュされないロードおよびストアでアクセスされます。命令セット拡張は、FENCE命令のIビットおよびOビットを使用して順序付けられる新しいI/O命令も記述する場合があります。

フェンスモードのエンコーディング

FENCEモードフィールドfmは、FENCE命令のセマンティクスを定義します。FENCE(fm=0000)は、そのpredecessorセット内のすべてのメモリ操作を、そのsuccessorセット内のすべてのメモリ操作より前に順序付けます。

FENCE.TSO命令は、fm=1000、predecessor=RW、successor=RWのFENCE命令としてエンコードされます。FENCE.TSOは、そのpredecessorセット内のすべてのロード操作を、そのsuccessorセット内のすべてのメモリ操作より前に順序付け、そのpredecessorセット内のすべてのストア操作を、そのsuccessorセット内のすべてのストア操作より前に順序付けます。これにより、FENCE.TSO'sのpredecessorセット内のnon-AMOストア操作は、そのsuccessorセット内のnon-AMOロードと順序付けされないままになります。

ℹ
FENCE RW,RWはFENCE.TSOが課す順序付けのスーパーセットを課すため、fmフィールドを無視し、FENCE.TSOをFENCE RW,RWとして実装することは正しいです。

FENCE命令の未使用フィールド--rs1 and rd--は、将来の拡張におけるより細かいフェンスのために予約されています。前方互換性のために、基本実装はこれらのフィールド#を無視するものとし、標準ソフトウェアはこれらのフィールドをゼロにするものとします。同様に、多くのfmおよびpredecessor/successorセット設定も将来の使用のために予約されています。基本実装は、そのような予約された構成をすべてFENCE命令(fm=0000)として扱うものとし、標準ソフトウェアは非予約構成のみを使用するものとします。

ℹ
我々は、単純なマシン実装および将来のコプロセッサまたはアクセラレータ拡張から高い性能を可能にするために、緩和されたメモリモデルを選択しました。デバイスドライバハート内での不要な直列化を避け、また追加されたコプロセッサまたはI/Oデバイスを制御するための代替の非メモリパスをサポートするために、I/O順序付けをメモリR/W順序付けから分離しました。単純な実装は、さらにpredecessor and successorフィールドを無視し、すべての操作に対して常に保守的なFENCEを実行する場合があります。