共有メモリ上の実行においては、
他のプロセッサとの間で望ましくない干渉や行き違いが生じないようにしたい。
そのために以下のようなプリミティブを設計し、用いた。
この項では、各プリミティブの基本的な概念を説明するための
「基本的なプリミティブ」について解説し、
実際に実装したプリミティブは「マクロ版プリミティブ」の項で詳しく解説する。
通常のロード/ストア命令や、cas命令が一括して扱うデータの粒度には、
プロセッサによる違いが大きい。
逐次処理では大きなデータは複数のロード/ストア命令などを用いて実現することに問題はないが、
共有メモリに関してロード/ストア命令を分けてしまうと
(例えば、64ビット変数にアクセスするために32ビットのアクセスを二回行う場合など)、
他のプロセッサとの間で望ましくない干渉が発生する。
粒度を保証するには適切な命令を用いてアクセスを行う注意する必要がある。
以下に示す、粒度保証同期変数アクセスプリミティブは、
同期変数へアクセスするための粒度を保証したプリミティブである。
制御の流れに沿って、機械語プログラム上の命令の実行順序(発行順序)は定まるが、
必ずしもその順序通り、プロセッサによって命令が実行されるとは限らない。
メモリアクセスについても、プロセッサ自身にとって一貫性が保たれてさえいれば、
メモリアクセスがメモリによってどの順序で処理されるのかは自由にできるようにする
ことで、性能を向上している。
しかし、共有メモリ環境においては、
コンパイラが、「自プロセッサだけが」実行したときに同一の結果が得られる範囲で
機械語命令の実行順序を入れ換えたり、無駄と思えるメモリアクセスを削除した場合、
共有メモリ上でのアクセスの完了順序が入れ換わってしまう可能性がある。
ここにメモリバリアプリミティブを用いることで、
アクセス完了順序の制約を与える。
ロックを相互排他に用いる場合、 同時に一つのプロセッサだけがロックを獲得することができ、 ロックが解放されるまで他のプロセッサによるロックの獲得は成功しないようにする。 このようなロックは、メモリ上で共有されている構造体へのアクセスを クリティカルセクション内で他のプロセッサと競合せずに行いたい場合などによく用いられる。