1

OpenMP 概要 pdf から:「操作により、特定のストレージの場所がアトミックに更新されることが保証されます」。これは、「アトミック」とは何か、それは単なるロック機構なのかという疑問を提起しました。したがって、私の記憶が正しければ、「アトミック」とは、何らかのハードウェア サポートが組み込まれており、他の値が変更されないようにすることを意味します。それで、本質的に「アトミック」なものを作ることは、ロックメカニズムを実装するだけですか、それともそれ以上のものですか?

4

2 に答える 2

1

「原子性」と「分離」について混乱があるかもしれません。これらは似たような概念ですが、微妙な違いがあります。原子性とは、操作が完全に完了するか、またはまったく完了しないことを意味します。分離は、同時に発生する操作が、それらの連続実行によって引き起こされた可能性のある状態になることを保証します。

たとえば、「x に 1 を足してから x に 2 を掛ける」という操作で、x が 3 から始まる場合、結果は何らかの障害があれば 3 になり、障害がなければ 8 になります。1を足した直後に電源が落ちても、リブートすると必ず3になる。

この操作を 2 回同時に実行するとどうなるかを考えてみましょう。どちらも失敗し、x=3 になる可能性があります。x=8 の場合、失敗する可能性があります。どちらも成功する可能性があります (x=18)。隔離が保証されている場合、これらが唯一の結果です。しかし、分離ではなく原子性のみが与えられた場合、個々の部分が「1 を加算、1 を加算、2 を乗算、2 を乗算」としてインターリーブされ、結果として x=20 になる 4 つ目の結果が発生する可能性があります。

原子性ではなく分離のみが保証されている場合、x=3、4、5、8、10、または 18 になる可能性があります。

とはいえ、これはよくある誤解であり、多くの場合、「原子性」と言うときは両方を意味します。それが、OpenMP ドキュメントでの意味についての私の疑いです。

于 2012-08-01T00:04:59.157 に答える
0

メモリに保存されている値の更新は、3段階のプロセスです。まず、値がメモリからフェッチされ、CPUのレジスタの1つに送られます。次に、レジスタの値が何らかの方法で変更されます(たとえば増分)。最後に、新しい値がメモリに書き戻され、再び使用できるようになります。

この(または他の)操作をアトミックに実行するということは、これら3つのステップすべてが発生するか、いずれも発生しないことを意味します。

同じメモリ値を使用する必要がある別のスレッドまたはプロセスがある場合にのみ、興味深いまたは重要になります。両方が値をインクリメントしたいとします。値は最初はゼロです。アトミック操作がないと、最初のスレッドがレジスタで元の値(0)をインクリメントしている場合でも、2番目のスレッドがメモリから元の値(0)を読み取る可能性があります。事実上、両方のスレッドが値0を認識し、それを1にインクリメントして、メモリに戻すことができます。このシーケンスの最後では、2回インクリメントされたにもかかわらず、メモリ内の値は1になります。

アトミックインクリメント操作では、そのシーケンスが発生する可能性はありません。最初のスレッドがアトミックシーケンスに入ると、最初のスレッドが値をインクリメントしてメモリに書き戻す前に、2番目のスレッドがメモリ内の値を読み取る方法はありません。常に正しい値(2)を取得します。

だから、あなたの質問に答えるために、それはほとんどロック機構のようなものです。特に、元の操作が何であれ、ロックメカニズムが周囲に存在するようなものです。アトミック操作自体は、ミューテックスやセマフォなどの他のロックメカニズムの実装で頻繁に使用されます。

于 2012-07-18T11:09:29.447 に答える