2

ワーカー スレッドを使用して大規模なアルゴリズムを高速化しようとしたときに、より多くのスレッドで独立した優先キューを使用すると実際にパフォーマンスが低下することに気付きました。そこで、小さなテストケースを書きました。

ここでは、開始するスレッドの数を照会し、各スレッドを独自のプロセッサに設定し、プライオリティ キューから多くのものをプッシュおよびポップします。各スレッドは独自の優先キューを所有しており、それらは個別に割り当てられているため、偽の共有は疑われません。

スニペットよりも長いため、ここにテスト ケースを配置します。(プロセッサ アフィニティ ビットはNCrunchから取得されます)

.NET にはビルトイン キューがなかったため、プライオリティ キューは私自身が作成したものです。違いが生じる場合は、ペアリング ヒープを使用します。

とにかく、1 つのスレッドと 1 つのコアでプログラムを実行すると、約 100% の使用率になります。 1 コア 2 スレッド/2 コア 2 つのコア で使用率が低下し、最終的には 8 コアすべてで 30% の使用率にまで低下します。 8 コア

パフォーマンスの低下により、マルチスレッド化によるメリットがすべて無効になるため、これは問題です。パフォーマンスの低下の原因は何ですか? 各キューは他のスレッドから完全に独立しています

4

2 に答える 2

2

円周率を解くなどのいくつかの問題は、並列化により適していて、ハイパースレッディングは実際に速度を上げることができます。あなたのように重いメモリの問題に対処している場合、ハイパースレッディングは役に立たず、実際に害を及ぼす可能性があります. CPU アーキテクチャの「パイプライン化」を調べてください。

2-CPU を使用することで 2 倍の高速化が得られる実用的な問題は多くありません。CPU が多いほど、オーバーヘッドが大きくなります。あなたのテスト ケース アルゴリズムでは、コアがメモリ サブシステムを待たなければならないのではないかと思われます。メモリ要件を微調整すると、メモリ要件を CPU キャッシュ サイズに近づけるにつれて、パフォーマンス (および使用率) が向上します。

于 2013-02-19T17:38:51.910 に答える
0

OS は、その時点で希望する CPU に処理を割り当てています。したがって、すべてのプロセッサがある程度の作業を行っていることがわかります。

さらに、「パフォーマンスの低下」と言うとき、システムが作成している競合の数を確認しましたか? おそらく、スレッド間の競合からも解放されているでしょう。

于 2013-02-19T16:55:23.060 に答える