![複数のサブプロセスは複数のコアを利用しますか?](https://rvso.com/image/1609692/%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%B5%E3%83%96%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AF%E8%A4%87%E6%95%B0%E3%81%AE%E3%82%B3%E3%82%A2%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
質問があります。基本的には、マシン上のすべてのコアを活用するための簡単な方法を探しています。
たとえば、データ セット D に対して動作し、「驚くほど並列」であり、j によって決定されるデータセットのサブセットに対してプログラムを実行するコマンドライン引数 j を受け取るプログラム「./theprogram」があるとします。
次にターミナルで次のコマンドを実行するとします
./theprogram j1 &
./theprogram j2 &
./theprogram j3 &
. etc
. etc
. etc
./theprgoram jfinal &
これで、j1、j2、...jfinalのサブプロセスが生成されました。
私の質問は、私が最新のUNIXシステム(マルチコアチップで動作する最新のMac OS Xなど)を持っていると仮定した場合です。
すると、プロセスはすべてのコアに個別に分散されるのでしょうか? つまり、すべてのコアを活用しているということですか?
答え1
理論的にはそうです。
オペレーティング システムは、未使用の CPU コアにタスクをスケジュールします。コアが未使用であることは、そのコアからタスクがスケジュール解除されたときにわかります。
プロセスの構造には、入力 (ディスク、キーボード、マウスなど) を待機しているかどうかを示すフラグが含まれます。したがって、これらのいずれをも待機していない場合は、スケジュール可能です。
オペレーティングシステムは基本的に、各コアのスケジュール可能なタスクのリストを実行し、それらをスケジュールします。タスクにはコア上で一定時間与えられ、その後再び一時停止され、OSがタスクが実行中かどうかを確認します。他のプロセスを実行する必要があります。
他のプロセスを実行する必要がない場合は、プロセスはリストの一番上に残り、再度実行されます。
当然の効果としては、プロセスが互いにブロックしたり、ディスク アクセスを待機して長い時間を費やしたりすることがなければ、管理オーバーヘッドがわずかであれば、CPU が最大限に活用されることになります。
これは、並列化可能なデータを持つ任意のマルチスレッド アプリケーションでテストできます。ビデオ エンコードとデータ圧縮は、この種の並列処理が効果を発揮する 2 つの状況です。
Handbrake は CPU ベースのビデオ エンコーダー (最近は GPU もサポート) で、CPU コアを好きなだけ使用でき、これにより高速化を実現できます。多くのビデオ エンコーダーは複数のコアを有効活用できます。x.264 やその他のエンコーダーも複数のスレッドをサポートしています。
7-Zip は、LZMA2 アルゴリズムで複数のスレッドを使用して圧縮を高速化できる圧縮プログラムです。圧縮辞書の構築は適切な共有プロセスであり、辞書が作成されると、実際の圧縮は「簡単に」並列化できます。
答え2
マルチプロセスを実行するには、次の条件を満たすコードセクションを選択する必要があります。
- 過去の結果に頼ることはできない
- 特定の順序で実行する必要はありません
- コード内で後でアクセスする必要があるものは何も返しません
したがって、私が聞いたところによると、複数のコアを使用できるはずです。