x86および他のアーキテクチャでは、ロックフリーのデータ構造を書くための特別なアトミック命令(lock、cmpxchgなど)が用意されています。しかし、より多くのコアが追加されるにつれて、これらの命令が実際にはバックグラウンドで行う必要がある作業が増えていくように見えます(少なくともキャッシュの一貫性を維持するためには?)。今日、デュアルコアシステムで原子アイドルが100サイクルかかる場合、将来の80以上のコアマシンではかなり長い時間がかかりますか?最後にコードを書いているのであれば、実際にはもっと遅くてもロックを使う方が良いでしょうか?さらに多くのCPUが追加されるとアトミック操作が遅くなりますか?
答えて
トポロジの制約は、数が数十ダース以上になると、コア間の通信の待ち時間を増やすことになります。私は、x86企業がそのようなスケーリングに対処する意図が何であるかを本当に知っていません。
しかし、ロックはアトミック操作の観点から実装されています。だから、実際に手作業でアトミック操作をしようとするよりもスケーラブルな方法で実装されていなければ、実際にそれらに切り替えることで勝つことはできません。私は、一般的に、シングルトークンライクな競合の場合、あなたが持っているコアの数にかかわらず、原子プリミティブは常に最速の方法であると考えています。
クレイが長い間発見したように、ここには無料のランチはありません。潜在的に競合するリソースを可能な限り頻繁に使用しようとする高度なソフトウェア設計は、大規模並列化アプリケーションでは最大の支払いにつながります。これは、ロック取得の結果として可能な限り多くの作業を行うことを意味しますが、できるだけ早く実行します。極端な状況では、これは、正常に取得したロックを仮定して作業を事前に計算し、取得しようとし、成功した場合はできるだけ早く完了し、そうでない場合は作業を中止し、失敗した時点で再試行します。
タイトルに記載されている質問については、短い答えは「はい」、長い答えは「複雑です」です。
ロックに関しては、いいえ、いいえ。内部的には、ロックは、バス上で少なくともそれ以上のトラフィック(そうでなくても)をプッシュする必要があります。このように考えると、プロセッサにはアトミック比較とスワップの1つのアトミック操作しかなければ、ロックとアトミック・インクリメントを実装するために使用できます。バスプロトコルレベルでは、使用されるプリミティブはほんのわずかです。ロックはアトミック操作よりも遅くはありません。なぜなら、ロックは異なるものを実行しているからです。コヒーレンシの観点から、同じことをより多く行っているため、ロックは遅くなります。原子操作が減速するにつれて、ロックは比較的遅くなる傾向があります。
と言われていますが、この件については多くの論文があり、特定のケースは複雑です。予測できないパフォーマンス特性を持つ80コアCPU(どのように設計されるかわからないため)で、コードがどのように拡張されるかについては心配しません。現在のCPUのように動作し、コードが正常に実行されるか、そうでないと、あなたが今推測したことが間違っていることが判明します。ほとんどの場合、コードはパフォーマンスに影響を受けていないことが判明しました。問題ではありませんが、適切であれば、将来、アーキテクチャとパフォーマンスの特性を理解したときに修正することになりますターゲットプロセッサの数。
現代のCPUでロックによってプッシュされる "バス"はありますか?あるいは、キャッシュコヒーレンスに基づく非活動化操作を使用していますか? – osgx
私は、原子操作がそれ自身で時間がかかることは問題ではないと思います。実際の問題は、アトミック操作が他のプロセッサ上のバス操作をブロックする可能性があることです(非アトミック操作を実行する場合でも)。
最後にコードを書きたい場合は、最初にロックしないようにしてください。
私はあなたを正しく理解していれば、1つのプロセッサで実行されているアトミックな操作が、他のすべてのプロセッサで減速を引き起こす可能性があると言っていますか?したがって、ロック命令の〜100サイクルのコストは、現在のスレッドまたはCPUを処理するだけでなく、現在のすべての実行フローに支払われますか? –
IIUCでは、ロック命令はバスロックを引き起こし、ロックがアサートされている間は他のプロセッサがローカルキャッシュを使用し続けることができます(それでもIIUC)。 –
これは正しいことです。アトミックな 'cmpxchg'は、メモリが別のCPUコアによって"足元 "に更新されないことを保証する主な方法です。実際に書き込んでいなくても書き込みサイクルを強制します。 – Blindy
この質問の補足として、将来参照するのはGPUに既に存在する技術だと言及する価値があります。現代のQuadro GPUは256コアを持ち、グローバル(ディスプレイ)メモリ上でアトミック操作を行うことができます。
これはどのように達成されているのかわかりませんが、実際には既に起こっているということです。
いいえ、GPUはディスプレイバッファ上でアトミック操作を実行しません。実際、最新のGPGPUコアとCPUコアの基本的な違いは、GPUコアがキャッシュの一貫性ではないことです。 –
ディスプレイバッファにはありませんが、CUDAにはビデオメモリ用のアトミック操作が組み込まれています。 – shoosh
@LouisGerbarg:アルファブレンディングによるレンダリングは、表示バッファの原子的な更新の一種です。 – ybungalobill
- 1. 多くのオーバーレイが追加された後、アンドロイドマップの移動が遅くなる
- 2. 多くのオーバーレイが追加された後、アンドロイドマップの移動が遅くなります
- 3. 多くのネストされたレイアウトを使用するとアプリの動作が遅くなりますか?
- 4. header.htmlにng-includeが追加されました。遅くとも
- 5. QTableViewに行を追加すると、多くの挿入後にアプリケーションが遅くなります
- 6. ImageViewを追加するとスクロールの動作が遅くなる
- 7. UITextFieldが1より多く追加され、ランダムに生成される
- 8. ネストされたアトミック操作はアトミックであることが保証されていますか?
- 9. animate.cssを私のレイアウトファイルに追加するとdevサーバーがクロールされるまで遅くなります
- 10. リーフレットを使用して多くのマーカーを追加するとブラウザが遅くなります
- 11. 多くのアクティビティが追加されたときにzoomtextviewライブラリがクラッシュする
- 12. viewAnimatorに多数のビューを追加すると、アンドロイドでプログラムが遅くなりますか?
- 13. InnoDBが非常に遅く挿入されて遅くなります
- 14. IISでホストされているWCFには多くの要求があり、サービスは遅くなります
- 15. Xcodeがゆっくりと実行され、CPUがホッグする
- 16. mysqlで新しく追加されたテーブルレコードを操作する
- 17. Sleuthを有効にするとリクエストが遅くなります(多く)
- 18. viewwillappearでカスタムナビゲーションバーを追加するとナビゲーションが遅くなりますか?
- 19. テキストが表示されなくなってから表示が遅くなる
- 20. モーダルメモリリークが多く追加されました。
- 21. Gitのデータベース操作またはアトミック操作のACIDプロパティに使用されるアトミックな用語はなぜ、どのようにコミットされますか?
- 22. MemoryCacheにアトミック操作を追加できますか?
- 23. データが多いほどクエリが遅くなりますか?
- 24. オブジェクトがキャッシュされているときにワニスが遅くなります(メモリ)
- 25. HQLクエリは、返されるフィールドが追加されたときに結果が少なくなります
- 26. 多くのものが画面に表示されているときにOpenglが遅くなる
- 27. curlを追加するとスクリプトがブロックされたり遅くなり、サーバー上で処理が実行される可能性はありますか?
- 28. スムージネスがより多く表示され、より少なく表示される
- 29. WPFリストビューアイテムにさらに多くのインタラクションを追加する
- 30. Hibernate - 何度も同じ操作を実行すると遅くなり、遅くなります
"リニアメモリポインタ"の概念を放棄し、セグメント化されたメモリモデルのようなものに戻り、 "オブジェクト"ごとに1つのセグメントを使用する必要があると私は思っていました。これは、多くのアプリケーションで、32ビットのオブジェクト参照が数ギガバイトのメモリにアクセスできるようにします(各キャッシュラインに収まるオブジェクト参照の数を2倍にします)。さらに、実装に応じて、そのようなシステムは、CASのようなものがインターロックを必要としないオブジェクトを排他的なストアに "チェックアウト"させることを可能にするかもしれません... – supercat
...別のプロセッサが要求しない限りオブジェクトをメインメモリにコピーして使用できるようになります(今日のプロトコルではキャッシュラインはチェックアウトされていますが、それはすべてのプロセッサが他のすべてのラインがチェックアウトしていることを知る必要があります)。メインメモリ内のオブジェクトの情報を排他的に使用する必要があり、誰かがそれを使用しようとする前に書き込みが完了したことを知ることができ、明示的に要求されない限りそのオブジェクトを監視する必要はありません。 – supercat