我听说在调用使用多处理的Python脚本之前使用OMP_NUM_THREADS=1
会使脚本更快。
是真是假?如果是,为什么会这样?
既然你在评论中说你的 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
。
在注释中解决:
OMP_NUM_THREADS是OpenMP的一个选项,OpenMP是一个C/C++/Fortran API,用于在进程中执行多线程。
目前还不清楚这与Python多处理有什么关系。
您的 Python 程序是否调用了用 C 编写的模块,这些模块在内部使用 OpenMP? – Wyzard