7

すべては完全に理論的なものであり、質問が頭に浮かんだだけで、答えが何であるかは完全にはわかりませんでした:

4 つの独立した計算を計算するアプリケーションがあるとします。(完全に独立しており、どの順序で実行しても問題ありません。別の計算を行う必要はありません)。また、これらの計算は長時間 (分) であり、CPU バウンド (いかなる種類の IO も待機していない) であると仮定します。

1) ここで、1 プロセッサのコンピューターを使用している場合、シングル スレッド アプリケーションはマルチスレッド アプリケーションよりも論理的に高速になります (または同じです)。コンピュータは 1 つのプロセッサで一度に複数のことを実行できないため、コンテキストの切り替えなどで時間を「無駄」にします。ここまでは順調ですね?

2) 4 プロセッサのコンピュータを使用している場合、4スレッドの方がシングル スレッドよりも高速です。右?コンピューターは一度に 4 つの操作を実行できるようになったため、アプリケーションを 4 つのスレッドに分割するのは論理的であり、4 つの計算のうち最長の時間で完了するはずです。ここまではまだいいの?

3) そして今、私が混乱している実際の部分 - 利用可能なプロセッサ (実際には - コア) の数よりも多くのスレッドをアプリケーションに作成させるのはなぜですか? 私はプログラムを作成し、数十から数百のスレッドを作成するアプリケーションを見てきましたが、実際には、平均的なコンピューターの場合、完璧な数は約 8 でしょうか?

PS私はすでにこれを読んでいます:スレッド対シングルスレッド ですが、静かに答えませんでした。

乾杯

4

4 に答える 4

5

使用可能なプロセッサ (実際にはコア) の数よりも多くのスレッドをアプリケーションで作成する必要があるのはなぜですか?

もっともな理由の 1 つは、イベントを待機するスレッドがある場合です。たとえば、プロデューサが何らかのデータ ストリームから読み取るプロデューサ/コンシューマ アプリケーションがあり、そのデータがバーストで到着する場合があります。バッチ内の数百 (または千) レコードの後に​​、しばらく何も記録されず、別のレコードが続きます。バースト。4 コアのマシンがあるとします。データを読み取ってキューに入れる 1 つのプロデューサー スレッドと、キューを処理する 3 つのコンシューマー スレッドを持つことができます。

または、1 つのプロデューサー スレッドと4 つのコンシューマー スレッドを使用することもできます。ほとんどの場合、プロデューサー スレッドはアイドル状態であり、4 つのコンシューマー スレッドがキューからアイテムを処理します。しかし、アイテムがデータ ストリームで利用可能な場合、コンシューマー スレッドの 1 つがプロデューサーに優先してスワップ アウトされます。

これは単純化した例ですが、私が実際に運用しているプログラムとほぼ同じです。

より一般的に言えば、処理ユニット (一般的には CPU コアですが、ハイパースレッディングの存在により少し水が濁ります) よりも継続的に動作する (つまり、CPU バウンドの) スレッドを作成しても意味がありません。スレッドが外部イベントを待機しないことがわかっている場合、コアn+1しかないときにスレッドをn使用すると、スレッド コンテキスト スイッチで時間を浪費することになります。これは厳密にプログラムのコンテキストにあることに注意してください。他のアプリケーションや OS サービスが実行されている場合、他のアプリケーションやサービスがタイムスライスを取得できるように、アプリケーションのスレッドが時々スワップ アウトされます。ただし、CPU を集中的に使用するプログラムを実行している場合は、同時に実行される他のアプリやサービスを制限すると想定されています。

もちろん、最善の策はテストを設定することです。4 コア マシンで、1、2、3、4、5、... スレッドでアプリをテストします。さまざまな数のスレッドで完了するのにかかる時間。4 コアのマシンでは、スイート スポットは 3 または 4 になることがわかると思います。多くの CPU を使用する他のアプリまたは OS サービスがない限り、おそらく 4 です。

于 2014-09-11T14:38:50.653 に答える
1

アプリケーションにスレッドを追加することは、厳密にはパフォーマンスの向上に関するものではありません。プログラムを設計する最も論理的な方法であるため、同時に複数のタスクを実行したい、または実行する必要がある場合があります。

たとえば、ゲーム エンジンを作成している場合、マルチスレッド アプローチを採用する場合、物理演算用に 1 つのスレッド、グラフィックス用に 1 つのスレッド、ネットワーク用に 1 つのスレッド、ユーザー入力用に 1 つのスレッド、リソースの読み込み用に 1 つのスレッドを使用できます。ディスクなどから

また、James Baxters のポイントも非常に当てはまります。スレッドがリソースを待機していて、そのリソースにアクセスするまでそれ以上実行できない場合があります。コアと同じ数のスレッドしかない場合、1 つのコアが無駄になります。

于 2014-09-11T14:33:02.353 に答える
1

コアよりも多くのスレッドを考え出すことができる理由の 1 つは、一部のスレッドが他の関係者とやり取りする必要がある場合です...サーバーからの応答を待っている..データベースから何かを照会しています。これにより、回答が提供されるまでスレッドがスリープ状態になります。この方法では、他の計算を待つ必要がありません。4cores->4thread では、スレッドは入力を待機するため、他のコードも待機する必要がある可能性があります

于 2014-09-11T14:31:02.570 に答える
1

すべてのプログラムが CPU バウンドであると想定していると思います。スレッドの一部が I/O (ディスク/ネットワーク/ユーザー トラフィック) を待機していることを思い出してください。

于 2014-09-11T14:29:51.543 に答える