「メモリバリア」の版間の差分

提供: C言語入門
移動: 案内検索
(ページの作成:「メモリバリア (Memory Barrier) とは、「メモリ操作を実行する命令」の実行順序を維持する プロセッサ(CPU) の機能です。メモリ...」)
 
(相違点なし)

2016年2月13日 (土) 12:14時点における最新版

メモリバリア (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の待ちを減らし、処理にかかる全体の時間を短くするための技術です。

関連項目