マルチプロセッシングを使用するPythonスクリプトを呼び出す前にOMP_NUM_THREADS=1
を使用すると、スクリプトの処理速度が向上すると聞きました。PythonマルチプロセッシングでOMP_NUM_THREADS = 1を使用する
それは本当ですか?はいの場合は、どうしてですか?
マルチプロセッシングを使用するPythonスクリプトを呼び出す前にOMP_NUM_THREADS=1
を使用すると、スクリプトの処理速度が向上すると聞きました。PythonマルチプロセッシングでOMP_NUM_THREADS = 1を使用する
それは本当ですか?はいの場合は、どうしてですか?
あなたのPythonプログラムがOpenMPを使用するCモジュールを呼び出していることをコメントで言ったので:
OpenMPのは、プロセス内のマルチスレッドんし、デフォルトのスレッド数は、典型的には、CPUができることの数です実際には同時に実行されます。 (これは一般的にCPUコアの数、またはCPUにIntelのハイパースレッディングなどのSMT機能がある場合はその数の倍数です)。たとえば、クアッドコア非ハイパースレッドCPUを使用している場合、OpenMPはデフォルトでは4つのスレッドを実行します。
Pythonのmultiprocessing
モジュールを使用すると、プログラムは同時に実行できる複数のPythonプロセスを開始します。プロセスの数を制御できますが、多くの場合CPUコア/スレッドの数にすることができます。 multiprocessing.cpu_count()
によって返されました。
multiprocessing
プログラムを実行して4つのPythonプロセスを実行し、それぞれがOpenMP関数を呼び出して4つのスレッドを実行すると、そのクアッドコアCPUはどうなりますか?あなたは4コアで16スレッドを実行することになります。これはうまくいくが効率は最高ではない。なぜなら各コアはある時間をタスク間で切り替えなければならないからだ。
設定すると、OMP_NUM_THREADS=1
は基本的にOpenMPマルチスレッドを無効にするので、各Pythonプロセスはシングルスレッドのままです。
これを行うには、十分なPythonプロセスを開始していることを確認してください。 4つのCPUコアを持ち、シングルスレッドのPythonプロセスを2つだけ実行すると、2つのコアが使用され、もう1つがアイドル状態になります。 (この場合、あなたはOMP_NUM_THREADS=2
を設定することをお勧めします。)
コメントで解決済み:
OMP_NUM_THREADSは、OpenMP、プロセス内でマルチスレッドを行うためのC/C++/FortranのAPIのためのオプションです。
これはPythonのマルチプロセッシングにも関係がありません。
OpenMPを内部的に使用するPythonプログラム呼び出しモジュールがC言語で記述されていますか? - Wyzard
'OMP_NUM_THREADS'は、プロセス内でマルチスレッドを行うためのC/C++/Fortran APIである[OpenMP](https://en.wikipedia.org/wiki/OpenMP)のオプションです。それがPythonのマルチプロセッシングにどう関係しているのかははっきりしていません。あなたのPythonプログラムは、OpenMPを内部で使用するC言語で書かれたモジュールを呼び出していますか? – Wyzard
正しい。それは事を説明する!ですから、私はオプションで、マルチプロセッシングを行っている別のプロセスを呼び出すために、Pythonのマルチプロセッシングを避けることができると思います。 –