使用OMP_NUM_THREADS=1进行Python多处理

2024-04-26 12:14:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我听说在调用使用多处理的Python脚本之前使用OMP_NUM_THREADS=1会使脚本更快。

是真是假?如果是,为什么?


Tags: 脚本numthreadsomp
2条回答

在评论中解决:

OMP_NUM_THREADS is an option for OpenMP, a C/C++/Fortran API for doing multi-threading within a process.
It's unclear how that's even related to Python multiprocessing.
Is your Python program calling modules written in C that use OpenMP internally? – Wyzard

既然您在注释中说您的Python程序正在调用使用OpenMP的C模块:

OpenMP在进程中执行多线程,默认线程数通常是CPU实际可以同时运行的线程数。(这通常是CPU核的数量,如果CPU具有SMT功能(如英特尔的超线程),则是该数量的倍数。)因此,如果您具有四核非超线程CPU,OpenMP将希望在默认情况下运行4个线程。

当使用Python的multiprocessing模块时,程序将启动多个可以同时运行的Python进程。您可以控制进程的数量,但通常希望它是CPU核心/线程的数量,例如由multiprocessing.cpu_count()返回的。

那么,如果运行一个运行4个Python进程的multiprocessing程序,并且每个调用一个OpenMP函数运行4个线程,那么在这个四核CPU上会发生什么?你最终在4核上运行16个线程。这会起作用,但不会达到最高效率,因为每个核心都需要花一些时间在任务之间切换。

设置OMP_NUM_THREADS=1基本上会关闭OpenMP多线程,因此每个Python进程都保持单线程。

不过,如果这样做,请确保启动了足够多的Python进程!如果您有4个CPU内核,并且只运行2个单线程Python进程,那么您将使用2个内核,而其他2个处于空闲状态。(在这种情况下,您可能需要设置OMP_NUM_THREADS=2。)

相关问题 更多 >