メモリバリア
メモリバリア (Memory Barrier) とは、「メモリ操作を実行する命令」の実行順序を維持する プロセッサ(CPU) の機能です。メモリフェンス(Memory Fence)とも呼ばれます。
読み方
- メモリバリア
- めもり ばりあ
- Memory Barrier
- めもり ばりあ
概要
マルチプロセッサというシステムの環境や、アウトオブオーダー実行といったCPUの技術により、注意していないとプログラムの結果が変わってしまう可能性があります。
メモリバリア は、実行の順序性の制限を提供します。
プログラムが1つのCPUで実行される場合
プログラムが 1つの CPU で実行される場合、ハードウェアは、「すべてのメモリ操作が プログラムされた順番通りに行われたかのように見える」ように 命令を実行します。
従って、メモリバリア は必要ありません。
メモリが複数の機器で共有される場合
マルチプロセッサのCPU郡やメモリマップドI/O を利用している環境では、複数の機器によってメモリが共有されます。このような環境では、アウトオブオーダー実行により、プログラムの結果が変わることがあります。
以下に例を示します。
x と flag の初期値は、0 です。このときに、以下のプログラムを実行します。
プロセッサ#1 loop: flag の値をロードし、 0 ならば loop へジャンプ x の値を表示 プロセッサ#2 x に 123 を格納する flag に 1 を格納する
このプログラムの結果は、常に 123 が表示されることが期待されます。 しかし、プロセッサ#2 の命令が アウトオブオーダー実行 で実行された場合、 「x に 123 を格納する」命令の前に、 「 flag に 1 を格納する」 命令が実行される可能性があります。その場合、プロセッサ#1 の「x の値を表示」は 0 を表示する可能性が出てきます。
解決策は、 「flag に 1 を格納する」 というストア命令の前に、メモリバリアをおくことで、ほかのプロセッサからみても、 x が flag の前に更新されることが保証されます。
アウトオブオーダー実行とは
アウトオブオーダー実行とは、命令を順番通りに処理しないやり方です。
処理に必要なデータが揃った命令から実行する仕組みです。 あとの命令を先に実行することで、CPUの待ちを減らし、処理にかかる全体の時間を短くするための技術です。
関連項目
ツイート