メモリオーダリング
SMPにはいくつかのメモリ一貫性モデルが存在する:
逐次一貫性(すべての読み込みと書き込みは順番通りに実行される)
緩い一貫性(いくつかのリオーダリングが許される) 読み込みが他の読み込みの後に並べ替えられる(キャッシュコヒーレンシやスケーラビリティのため) 読み込みが書き込みの後に並べ替えられる 書き込みが他の書き込みの後に並べ替えられる 書き込みが読み込みの後に並べ替えられる
弱い一貫性(明示的なメモリバリアによる制限を除けば、読み込みと書き込みの任意の並べ替えが可能)
いくつかのCPUでは、
読み書き命令があると不可分操作がリオーダするかもしれない。
一貫性のない命令キャッシュパイプラインがありえる。 その場合、命令キャッシュのフラッシュ/再読み込みといった特殊な命令なしには自己書き換えコードが動かない。
依存関係のあるデータ読み込みもリオーダするかもしれない(Alpha固有)。プロセッサがあるデータへのポインタを読み込んだときでも、そのポインタが指す正しいデータではなく、すでにキャッシュされてまだ無効になっていない古いデータをフェッチするかもしれない。この緩いリオーダリングを許すことで、ハードウェアはシンプルで高速になるが、読み込み側と書き込み側の両方でメモリバリアが必要になる。

↑ このカラムは大多数のx86プロセッサの動作を示している。一部の特殊なx86プロセッサ(1998年頃に製造されたIDT WinChip)では、「oostore」メモリ順序が弱い場合がある。
プログラム言語のセマンティクスにより、コンパイラが式を左から右の順に翻訳するように制限されている場合、生成されるコードはプログラマが元のプログラムに次のような文を書いたかのようになる。
コンパイラが加算の連想性を利用することを許可されている場合、代わりに次のようなコードが生成される。
コンパイラが加算の可換性を利用することを許可されている場合、代わりに次のように生成されるかもしれない。
ほとんどのプログラミング言語の整数データ型は、整数のオーバーフローがない場合に数学の整数の代数に従うだけであり、また、ほとんどのプログラミング言語で利用可能な浮動小数点データ型の浮動小数点演算は、丸め効果においては可換ではなく、表現の順序の影響が計算結果の小さな違いとして現れることに注意すべきである(ただし、最初の小さな違いは、長い計算の間に任意の大きな違いに連鎖する可能性がある)。
プログラマが整数のオーバーフローや浮動小数点の丸め効果を気にする場合は、同じプログラムを元のハイレベルで次のようにコード化することができる。
コンパイル時には、上位コードで指定されたものよりも細かい粒度のハードウェア命令が生成されることがある。手続き型プログラミングで観察できる主な効果は、名前の付いた変数に新しい値を割り当てることである。
変数sumに代入する文の後にprint文が続いているので、print文が計算された変数sumを参照するときには、事前の実行シーケンスの観察可能な効果として、この結果を参照していることになる。プログラムシーケンスのルールで定義されているように、print関数コールがsumを参照するとき、sumの値は、変数sumに割り当てられた最も最近に実行されたもの(この場合、直前のステートメント)でなければならない。
マシンレベルでは、1つの命令で3つの数字を足すことができるマシンはほとんどないので、コンパイラはこの式を2つの加算演算に変換する必要がある。