メモリバリア
メモリバリアは、アーキテクチャのメモリモデルの定義の一部の低レベルプリミティブである。命令セットと同様、メモリモデルはアーキテクチャによって様々であるため、その動作を概括的に述べることは適切ではない。一般にメモリバリアを正しく使用するには、プログラミング対象のハードウェアのアーキテクチャマニュアルを読むべきである。とはいうものの、以下ではいくつかの実在するメモリバリアについて紹介する。
いくつかのアーキテクチャでは、「フルフェンス」と呼ばれる一種類のメモリバリア命令だけを提供する。フルフェンス命令は、その前の全ロード/ストア命令がフェンス後のロード/ストア命令の前に完了することを保証する。一例としては PowerPC のeioio命令がある。他のアーキテクチャでは、「acquire」命令と「release」命令でメモリバリアを構成する。これはリード・アフター・ライト操作の可視性に関するもので、読み込む側 (acquire) と書き込む側 (release) がそれぞれの観点で命令を使用する。具体的には、acquire側では順序性が必要なメモリ操作の後にメモリバリアを置き、メモリ操作の結果を他のCPUやスレッドに見せてからそれに依存する処理に入る。
プロセッサ#2 で動作するプログラムは x に 42 を格納してから f に 1 を格納する。擬似コードの一部を以下に示す。プログラムの各行が個々のプロセッサの命令に対応している。
表示されるのは常に 42 であることが期待されているが、プロセッサ#2 のストア命令がアウトオブオーダーで実行されれば、f が x の前に更新される可能性があり、"0" が表示される可能性も出てくる。上記の例のように f がプロセッサ間の同期を担っている場合や、f へのストアがメモリマップドI/Oを介したデバイスへのコマンド発行(この場合、プロセッサ#1 がデバイスに置き換わる)であるケースではこのような挙動は受け入れられない。メモリバリアをプロセッサ#2の位置 f へのストア命令の直前に挿入すると、他のプロセッサから見ても x が f の前に更新されているように観測されることを保証できる。