我听说在调用使用多进程的Python脚本之前使用OMP_NUM_THREADS=1
可以使脚本更快。
这是真的吗?如果是,为什么会这样呢?
我听说在调用使用多进程的Python脚本之前使用OMP_NUM_THREADS=1
可以使脚本更快。
这是真的吗?如果是,为什么会这样呢?
根据您在评论中提到的内容,您的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。)
在评论中解决:
OMP_NUM_THREADS是OpenMP的选项,它是一个用于在进程内进行多线程的C/C++/Fortran API。
这甚至与Python多进程有什么关系还不清楚。
您的Python程序是否调用了使用OpenMP编写的C模块? - Wyzard
OMP_NUM_THREADS
是OpenMP的一个选项,它是用于在进程内进行多线程的C/C++/Fortran API。目前尚不清楚它与Python多进程编程的关系。您的Python程序是否调用了使用OpenMP内部的C编写的模块? - Wyzard