共有クラスタで作業しています。私はこのクラスタで並列化されたCコードを実行している人を見たことがあり、top
実行中のプロセスを見るとCPUの400%を使用することがわかりました。なぜなら、彼らはコードの単一のインスタンスに4つのプロセッサを使用していたからです。
今、誰かが(私が知っている限り)並列化されたPythonコードを実行しています。しかし、Pythonコードはtop
CPUの400%を使用しているようには見えず、むしろそれぞれ独自のプロセッサ(100%)を使用する4つの異なるプロセスとして表示されます。
top
Python(並列化されたとき)がCとは異なり、さまざまなプロセスで実行されているように見えるのか、このPythonコードが実際に並列で実行されていないのか疑問に思います。
この問題を解決するために Stack Exchange がより良い場所かどうかはわかりません。利用しているのでtop
ここがもっと良さそうだと思いました。移動すべきか教えてください。
答え1
Cで見られるのはスレッドの使用量なので、プロセス使用量はすべてのスレッドの合計です。 4つのスレッドがあり、各スレッドのCPU使用率が100%の場合、プロセスは400%で表示されます。
Pythonで見ることができるのは、マルチプロセスモデルによって達成された並列性であることはほぼ確実です。これはPythonのスレッド制限を克服するために設計されたモデルです。 Pythonは一度に1つのスレッドしか実行できません(Pythonグローバルソルバーロック - GILを参照)。より良い結果を得るには、psで複数のプロセスとして表されるスレッドの代わりにプロセスを生成するマルチプロセスモジュールを使用できます。その後、各プロセスはすべて単一のプロセススレッドであるため、CPUの最大100%を使用できます。
実行すると、ps -afeT
Cプログラムのスレッドは表示されますが、Pythonプログラムの他のスレッドは表示されません。
答え2
参照Pythonの実装CPythonにはグローバルインタープリターロック(GIL)があり、次の環境でコードを実行するのを防ぎます。平行線、ただ同時に。スレッドはI / Oにのみ役立ちます。並列に実行するには複数のプロセスが必要です。あなたが見ているCコードは、並列性を達成するためにスレッドを使用する可能性が高いです。