繁体   English   中英

使用 OMP_NUM_THREADS=1 进行 Python 多处理

[英]Use of OMP_NUM_THREADS=1 for Python Multiprocessing

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

这是真的还是假的? 如果是,为什么会这样?

由于您在评论中说您的 Python 程序正在调用使用OpenMP的 C 模块:

OpenMP 在一个进程内进行多线程处理,默认的线程数通常是 CPU 实际可以同时运行的数量。 (这通常是 CPU 内核的数量,如果 CPU 具有SMT功能,例如 Intel 的超线程,则是该数量的倍数。)因此,例如,如果您有一个四核非超线程 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 程序是否调用内部使用 OpenMP 的 C 语言编写的模块? – 威扎德

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM