私は最近メモリモデルについて調べていて、これがどのように機能するかについてちょっと混乱していました.
http://cis.poly.edu/muller/CS623/weakmemory.htmを引用するには
プロセッサが新しい X を書き込んでから新しい Y を書き込んだ場合、その後 Y の読み取りと X の読み取りを実行する他のすべてのプロセッサは、新しい Y と新しい X、古い Y と新しい X、または古い X と古い X のいずれかにアクセスします。 Y: ただし、新しい Y と古い X にアクセスするプロセッサはありません。この強い順序付けの仮定は、かつては合理的でした。ただし、現在のコンピュータ メーカーは、プログラマがメモリの順序付けに依存しないことを推奨しています。これは、新しいメモリ管理システムが最適化のためにメモリ アクセスの順序を変更しようとするためです。メモリ要求の並べ替えが許可されているシステムは、弱順序メモリ システム (モデル) と呼ばれます。並べ替えを使用してパフォーマンスを向上させる方法を調べるには、次のアセンブラー コードを検討してください [2]。
Load reg1, A // register1 = contents of memory A
Load reg2, B // register2 = contents of memory B
ADD reg3, reg1, reg2 // register3 = register1 + register2
Store reg3, C // contents of memory C = contents of register3
ロケーション B が現在キャッシュにあり、ロケーション A がキャッシュされていないと仮定すると、A のロードは B よりも時間がかかります。A を待つ代わりに、CPU はキャッシュから B をフェッチして、B のレイテンシを隠します。したがって、CPU は実行できます。 Aが利用可能になり次第、追加。実行の強力な (シーケンシャル) メモリ モデル (つまり、A を最初にロードし、次に B をロードする必要がある) を緩和することで、パフォーマンスを向上させることができますが、並べ替えはソフトウェアに対して透過的ではない場合があります。以下のコード フラグメントを検討してください。これは、スピンロック セマフォの実装に使用できるコードの一部です [2]。
私の質問は、メモリ モデルが弱いと、プロセッサが新しい Y と古い X にアクセスできる可能性があるということです。同じメモリ (RAM) に書き込まれていませんか、それとも動作が異なりますか? あるプロセスが変数を変更し、その後別のプロセスがそれを読み取ると、最新の値が読み取られると思います。
私がよくわからないもう1つのことは、どのコンポーネントがメモリアクセスの並べ替えを許可しているかということです。私の仮定は、コンパイラが命令の並べ替えを許可されているということです。しかし、CPU はそれらを並べ替えることもできますか?
ありがとう