2017-05-10 2 views
2

Ich habe gehört, dass mit OMP_NUM_THREADS=1 vor dem Aufruf eines Python-Skript, das Multiprocessing verwenden, das Skript schneller.Verwendung von OMP_NUM_THREADS = 1 für Python Multiprocessing

Ist es wahr oder nicht? Wenn ja, warum?

+2

'OMP_NUM_THREADS' ist eine Option für [OpenMP] (https://en.wikipedia.org/wiki/OpenMP), eine C/C++/Fortran API für Multithreading innerhalb eines Prozesses. Es ist unklar, wie das mit dem Python-Multiprocessing zusammenhängt. Ruft Ihr Python-Programm in C geschriebene Module auf, die OpenMP intern verwenden? – Wyzard

+0

Korrigieren. Das erklären Dinge! Also, ich schätze, die Option vermeidet Python-Multiprocessing, um einen anderen Prozess aufzurufen, der Multiprocessing durchführt. –

Antwort

1

Da sagte Sie in einem Kommentar, dass Ihr Python-Programm ein C-Modul ruft die OpenMP verwendet:

OpenMP ist innerhalb eines Prozesses Multi-Threading und die Standard-Anzahl der Threads ist in der Regel die Anzahl, dass die CPU kann tatsächlich gleichzeitig laufen. (Dies ist im Allgemeinen die Anzahl der CPU-Kerne, oder ein Vielfaches dieser Zahl, wenn die CPU über eine SMT-Funktion wie Intels Hyper-Threading verfügt.) Wenn Sie beispielsweise eine CPU ohne CPU mit vier Kernen besitzen, wird OpenMP dies tun Ich möchte 4 Threads standardmäßig ausführen.

Wenn Sie Pythons Modul multiprocessing verwenden, startet Ihr Programm mehrere Python-Prozesse, die gleichzeitig ausgeführt werden können. Sie können die Anzahl der Prozesse steuern, aber oft möchten Sie, dass es sich um die Anzahl der CPU-Kerne/Threads handelt, z. zurückgegeben von multiprocessing.cpu_count().

Also, was passiert auf dieser Quad-Core-CPU, wenn Sie ein multiprocessing Programm ausführen, das 4 Python-Prozesse ausführt, und jeder Aufruf eine OpenMP-Funktion 4 Threads ausgeführt wird? Am Ende laufen 16 Threads auf 4 Kernen. Das wird funktionieren, aber nicht mit maximaler Effizienz, da jeder Kern einige Zeit zwischen den Aufgaben wechseln muss.

Einstellung OMP_NUM_THREADS=1 schaltet das OpenMP-Multithreading grundsätzlich aus, sodass jeder Ihrer Python-Prozesse single-threaded bleibt.

Stellen Sie sicher, dass Sie genug Python-Prozesse starten, wenn Sie dies tun! Wenn Sie 4 CPU-Kerne haben und Sie nur 2 single-threaded Python-Prozesse ausführen, haben Sie 2 Kerne verwendet und die anderen 2 Leerlauf. (In diesem Fall sollten Sie OMP_NUM_THREADS=2 einzustellen.)

0

in den Kommentaren Entschlossen:

OMP_NUM_THREADS ist eine Option für OpenMP, ein C/C++/Fortran API dafür innerhalb eines Prozesses Multi-Threading.
Es ist unklar, wie das überhaupt mit Python-Multiprocessing verwandt ist.
Ruft Ihr Python-Programm in C geschriebene Module auf, die OpenMP intern verwenden? - Wyzard