使用OMP_NUM_THREADS=1进行Python多进程处理

15

我听说在调用使用多进程的Python脚本之前使用OMP_NUM_THREADS=1可以使脚本更快。

这是真的吗?如果是,为什么会这样呢?


3
OMP_NUM_THREADSOpenMP的一个选项,它是用于在进程内进行多线程的C/C++/Fortran API。目前尚不清楚它与Python多进程编程的关系。您的Python程序是否调用了使用OpenMP内部的C编写的模块? - Wyzard
正确。这解释了很多问题!所以,我猜选项是避免使用Python多进程来调用另一个正在进行多进程处理的进程。 - fast_cen
2个回答

22

根据您在评论中提到的内容,您的Python程序调用了一个使用OpenMP的C模块:

OpenMP可以在进程内执行多线程操作,默认线程数通常是CPU实际可同时运行的数量(一般为CPU核心数,如果CPU具有SMT功能,如英特尔的超线程技术,则为该数字的倍数)。因此,如果您有一个四核心非超线程CPU,OpenMP默认会想要运行4个线程。

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

那么,在该四核心CPU上,如果运行一个运行4个Python进程并且每个进程调用运行4个线程的OpenMP函数的multiprocessing程序,会发生什么?你最终在4个核心上运行16个线程。这样可以工作,但效率不足,因为每个核心必须花费一些时间在任务之间切换。

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

请确保启动足够数量的Python进程,如果这样做。例如,如果您有4个CPU核心,并且只运行2个单线程Python进程,则有2个核心被利用而另外2个处于空闲状态。(在这种情况下,您可能需要将OMP_NUM_THREADS=2设置为2。)


0

在评论中解决:

OMP_NUM_THREADS是OpenMP的选项,它是一个用于在进程内进行多线程的C/C++/Fortran API。
这甚至与Python多进程有什么关系还不清楚。
您的Python程序是否调用了使用OpenMP编写的C模块? - Wyzard


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接