web-dev-qa-db-ja.com

計算にはいくつのコアを使用する必要がありますか? #coresまたは#cores -1?

計算量が多いです。すべてのコアを使用できますが、1つのコアを省略して使用しない理由はあるのでしょうか。 (計算CPUはIOのみなし)。それとも、すべてのコアを利用しても、適切なコンテキストスイッチングを処理および実行することを知らないOSを過小評価していますか?

12
Jas

主要なオペレーティングシステムは十分に成熟しており、利用可能なすべてのコアを使用するプロセスの処理方法を知っています。他のプロセスが影響を受ける可能性があります(多くの場合、影響を受けます)が、使用可能なすべてのコアを使用したため、計算が遅くなることはありません。

コアの数の選択は、計算が実行されている間に他のことをするというあなたの意図によります。

デスクトップマシンで、計算の実行中にWebブラウザーを使用したり、ビデオを見たりしたい場合は、コアを1つ空けておくことをお勧めします。同様に、サーバーが2つのことを実行している場合(計算を実行すると同時に、そのメトリックを処理および報告するなど)、サイドタスク用にコアを解放することは良い考えです。

一方、計算をできるだけ速くすることを優先する場合は、すべてのコアを使用する必要があります。

28

場合によります。

マシンがこの計算専用である場合、すべてのコアを使用する必要があります– 未使用のコンピューティングリソースは速度を上げません

リアルタイムスケジューラ、非プリエンプティブスケジューラ、またはプロセッサアフィニティを使用している場合は、他のプロセスがすべてのコンピューティングリソースから誤って枯渇する可能性があるため、もう少し注意する必要があります。ただし、問題が発生する場合は手動でこれらの設定を変更する必要があるため、デフォルトでは、ほとんどのOSで問題は発生しません。

マシンが計算専用でない場合、計算に100%を与えることは理想的ではないかもしれません。たとえば、計算の実行中にWebブラウザーを使用している場合などです。マシンの負荷が100%を超えることがあるので、動作が遅く感じられます。計算のようなスループット指向のタスクは実際には遅くなりませんが、GUIのようなレイテンシの影響を受けやすいタスクはそれほど速く反応しません。次に、計算のためにNPROC-1スレッド/プロセスのみを開始するのが賢明です。または、通常のタスクよりも低い優先度を計算に使用すると、この問題を解決できます。この場合、計算はNPROCプロセスを使用してリソースを浪費しないようにする必要があります。

11
amon

彼の反対票のために、以下の@motoDrizztに同意することに少し慎重ですが、それは確かに私の実際の経験です-コアの実際の数(数千ではありません)を超えても、もっと良いです。たとえば、 http://www.forkosh.com/images/avoronoi.gif を見てください。この3D-voronoi_diagramの各2D平面は独立して生成できます。そして、プログラムはnfork =nquery_string属性を使用して、n平面の計算を「同時に」フォークします。

4コアプロセッサでは、ダイアグラムを完了する(ユーザーの)時間は、nforkを使用すると、ほぼnfork = 8(4コアのハイパースレッド)まで直線的に減少します。しかし、8を超えると、時間はより遅くなりますが、依然として減少します。また、約16を超えると、それ以上目立った改善はありません。私はこの動作をまったく分析していませんが、単純にos(この場合はLinux slackware 14.2x64)ジャグリングプロセスに起因して、全体的なアイドル時間をさらに削減しています。

1
John Forkosh

最良の選択はシステムに依存します。ですから、実際のシステムで両方のバージョンを実行し、システムの応答を確認する必要があります。システムでブラウザ、テキストエディタなどを引き続き使用できますか?また、n-1ではなくnスレッドを使用するとパフォーマンスが向上しますか?すべてのCPUを使用しようとする別のアプリと一緒にアプリを実行するとどうなりますか?

そして、ハイパースレッディングを検討する必要があります。 4つのコアとハイパースレッディングにより、8コアまたは7コアを使用できます。繰り返しになりますが、システムの応答性と終了までの時間を試してください。

最後に、作業をスレッドよりも多くのブロックに分割することを検討してください。その理由は、異なるスレッドが異なる時間にジョブを完了するため、残りの作業をより高速なスレッドに渡す必要があるためです。それ以外の場合は、最後のスレッドが完了するまで待つ必要があります。

PS。 「ハイパースレッディングは、FPUが1つしかないため、FPUを多用するコードには役立ちません」。間違いです。 FPUを多用するコードを使用しても、レイテンシのためにFPUを最大限に活用することは非常に困難です。スケジューリングに使用できる独立した操作が2倍あるため、ハイパースレッディングが役立ちます。

0
gnasher729