std::atomic<T>
また、競合のないアトミック変数( C ++など)の操作と比較して、どれだけ高速/低速です。
また、競合していないロックと比較して、競合しているアトミック変数はどれくらい遅いですか?
私が取り組んでいるアーキテクチャはx86-64です。
std::atomic<T>
また、競合のないアトミック変数( C ++など)の操作と比較して、どれだけ高速/低速です。
また、競合していないロックと比較して、競合しているアトミック変数はどれくらい遅いですか?
私が取り組んでいるアーキテクチャはx86-64です。
たまたま、低レベルの速度テストがたくさんあります。ただし、速度が正確に何を意味するかは、正確に何をしているかに大きく依存するため、非常に不確実です (操作自体とは無関係であっても)。
以下は、AMD 64 ビット Phenom II X6 3.2Ghz の数値です。私はこれをIntelチップでも実行しましたが、時間は大きく異なります(これも、正確に何が行われているかによって異なります)。
完全に隔離されたアトミックな追加であるGCC__sync_fetch_and_add
は、平均 16ns、最小時間 4ns です。最小時間はおそらく真実に近いでしょう (ただし、それでも少しオーバーヘッドがあります)。
競合していない pthread ミューテックス (boost による) は 14ns (最小値でもあります) です。他の何かがミューテックスをロックした場合、実際には時間は増加しますが、現在競合していないわけではないため、これも少し低すぎることに注意してください (キャッシュ同期が発生するため)。
失敗した try_lock は 9ns です。
x86_64ではこれは単なる通常の交換操作であるため、私は単純な古いatomic incを持っていません。可能な最小時間に近い可能性が高いため、1〜2nsです。
条件変数で待機なしで通知を呼び出すと、25ns です (何かが約 304ns 待機している場合)。
ただし、すべてのロックは特定の CPU 順序保証を引き起こすため、変更したメモリの量 (ストア バッファに収まるものは何でも) によって、そのような操作にかかる時間が変わります。そして明らかに、最悪の時期であるミューテックスで競合が発生した場合。実際にスレッドの切り替えが発生しない場合でも、Linux カーネルへの復帰には数百ナノ秒かかる場合があります。これは通常、アトミック ロックがカーネル呼び出しをまったく含まないため、パフォーマンスが優れている場所です。平均的なケースのパフォーマンスは、最悪のケースでもあります。ミューテックスのロック解除は、待機中のスレッドがある場合にもオーバーヘッドを発生させますが、アトミックでは発生しません。
注: このような測定を行うと問題が発生するため、結果は常に疑わしいものになります。私のテストでは、CPU 速度を固定し、スレッドの CPU アフィニティを設定し、他のプロセスを実行せず、大きな結果セットを平均化することで、変動を最小限に抑えようとしています。
さまざまなプラットフォームでこれを測定する目的で、GitHub にプロジェクトがあります。残念ながら、私の修士論文の後、これについてフォローアップする時間がありませんでしたが、少なくとも基本的なコードはありました。
__sync_fetch_and_add
組み込みと比較して、pthread と OpenMP ロックを測定します。
私の記憶では、ロックとアトミック操作の間にはかなり大きな違いがあると予想していましたが (~桁違い)、実際の違いは非常に小さいことが判明しました。
ただし、現在私のシステムで測定すると、私の当初の推測を反映した結果が得られます。つまり、(pthreads と OpenMP のどちらが使用されているかに関係なく) アトミック操作は約 5 倍高速であり、1 回のロックされたインクリメント操作には約 35ns かかります (これにはロックの取得が含まれます)。 、インクリメントの実行、およびロックの解除)。
ロックの実装に依存し、システムにも依存します。アトミック変数は、実際にはロックと同じ方法で競合することはできません ( acquire-release セマンティクスを使用している場合でも)。これがアトミック性の全体的なポイントです。ストアを伝播するためにバスをロックします (メモリに応じて)バリア モード) ですが、それは実装の詳細です。
ただし、ほとんどのユーザー モード ロックは単にラップされたアトミック オペレーションです。x86および x64 でアトミック オペレーションを使用した高性能でスケーラブルなロックに関する数値については、Intel のこのCriticalSection
記事を参照してください (残念ながら、Windows のロックと比較して統計は見つかりません。SWRはロックしますが、常に自分のシステム/環境のプロファイルを作成する必要があります)。