すべてのコアを使用すると効率が低下しますか?

すべてのコアを使用すると効率が低下しますか?

かなり重いテキスト検索を実行するプログラム (正確には PHP スクリプト) があります。このプログラムは 2 MB と 40 MB のファイルを読み込み、最初のファイルに表示される各単語が 2 番目のファイルのどこにあるかを検索します。

私は 4 コアの CPU (パソコン) を持っています。プロセスの実行を開始すると、CPU 使用率は 25%、負荷は 1 に跳ね上がります。別のファイルでプロセスを再度実行し始めると、CPU 使用率は 50%、負荷は 2 になります。これにより、個々のプロセスの効率は低下しますか? つまり、個別に実行する場合よりも、各プロセスが完了するまでに時間がかかりますか? 4 つのプロセスを実行して CPU 使用率が 100% になった場合はどうなりますか? その場合、実行速度は遅くなりますか?

2 つのプロセスを並列で実行すると、直列で実行するよりも早く完了すると思いますが、これは正しいでしょうか? 2 つ以上、たとえば 3 つや 4 つ実行した場合も、同じでしょうか? あるいはそれ以上でしょうか? この場合のボトルネックはどこにあるのでしょうか。プロセス数をコア数と同じかそれ以下に保っていれば、CPU で処理できると思いますが、メモリ アクセスはどうでしょうか? プロセスはメモリの読み取り中に待機する必要がありますか?

答え1

短い答え: ベンチマークしてください。

長い答え: 個々のプロセスは完了するまでに時間がかかりますが (周波数スケーリングのため)、全体的に最も効率的なのは各コアを 100% までロードすることです。

答え2

並列実行によってパフォーマンスが向上するか低下するかは、さまざまな要因に依存します。たとえば、

  1. 比較で大きなファイルを使用して大量の IO を実行している場合、ボトルネックは CPU ではなくディスクになり、パフォーマンスは確実に低下します。
  2. 同時に、ファイルのサイズがシステム内の RAM にちょうど収まる大きさで、複数のプロセスを実行する場合、ボトルネックとなるのは RAM であり、マシン内で IO が発生します。

つまり、ケースバイケースのシナリオになります。しかし、あなたの場合、並列で実行した場合にのみパフォーマンスが向上することはほぼ確実であり、私が何かを見落としていない限り、効率が低下するようなシナリオは考えられません。

答え3

ハードドライブでもネットワークでも、I/O 待機時間はそれほど多くないようです。GB 単位の RAM があると仮定すると、42MB のファイルは簡単に RAM にロードされるはずです。その時点では、4 つの並列プロセスが最良の結果をもたらすはずです。通常の OS プロセスを実行する必要があるときに、コンテキストの切り替えがわずかに発生します。

NUMA システムでは、各コアにメモリ プールが割り当てられています。カーネルがプロセスを別のコアに移行すると、ファイルが元のコアのメモリ プールに残っているため、パフォーマンスが低下する可能性があります。正直なところ、これがパーソナル コンピューターに当てはまるかどうかはわかりません。

答え4

一般的には、はい。コーディングの部分はしばらく無視してください。

最新のマルチコア プロセッサには、少数のコアのみが使用されている場合に周波数をわずかにブーストするブースト モードがあります。そのため、すべてのコアを使用すると、個々のコアが小さくなります。詳細はプロセッサによって異なります。

とはいえ、個々のブーストは通常​​、別のコアを取得する場合と比較して非常に小さい (数百 MHz) ため、合計は高くなります。そのため、すべてのコアを使用する方が本当に優れています。ブーストは主に、スケーリングがうまくいかず、コアあたりの周波数を高くする必要がある場合に行われます。これにはシングル スレッド ゲームが含まれます ;)

メモリ アクセスについて質問します。最近のサーバーでは、DRAM からのメモリ アクセス速度が 1 秒あたり 50 GB (ギガバイト) を超え、キャッシュからのアクセス速度がさらに高いことをご存じだと思います。したがって、この状況に陥る可能性は低いでしょう。IO が問題である可能性はありますが、CPU が最大限に機能せず、IO 待機統計が上昇することで、このことが分かります。キャッシュは、ここで大いに役立ちます。

関連情報