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
。)相关问题 更多 >
编程相关推荐