2016年7月2日土曜日

ARMのDMBとDSBの違い

ググれば公式なドキュメントがすぐにヒットするのだけれど、iOSのSafariではまともに見られないので、ここに備忘録を残しておく。

DMBは、これを挟んだ前後のロード・ストア命令の実行順序を保証する。以下の例の場合、

STR r0, [r1]  ; (*1)
MOV r2, #0    ; (*2)
DMB
STR r3, [r4]  ; (*3)
MOV r5, #1    ; (*4)
(*1)の方が(*3)より先に実行されることが保証される。ただ、ロード・ストア命令でもなければ依存関係もない(*2)と(*4)に対しては、何ら実行順序を保証しない。

DSBの方はより強力なバリアで、これより前のメモリ・キャッシュ絡みの命令が完了するまで、これより後の命令の実行をブロックする。以下の例の場合、

STR r0, [r1]  ; (*5)
MOV r2, #0    ; (*6)
DSB
STR r3, [r4]  ; (*7)
MOV r5, #1    ; (*8)
(*5)が完了してからでないとDSBは完了しないので、(*7)と(*8)は実行されない。ただし(*6)の実行順序を縛ることはない。

とりあえず安全側に倒すのであれば、迷ったら強力なDSBの方を使うというのもアリと言えばアリだろう。が、DSBは完了待ちをするとのことなので、プロセッサのパイプラインをストールさせてしまう可能性が高いだろう。当然、性能面では非常に望ましくない。もし(*5)がバス構成的に遠くにあるペリフェラルのレジスタだった場合、バスアクセスのレイテンシが全く隠蔽されずに見えてしまったりするのだろう。まあ、よく考えて選べってことだ。

0 件のコメント:

コメントを投稿