【问题标题】:Use of OMP_NUM_THREADS=1 for Python Multiprocessing使用 OMP_NUM_THREADS=1 进行 Python 多处理
【发布时间】:2017-10-09 05:28:29
【问题描述】:

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

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

【问题讨论】:

  • OMP_NUM_THREADSOpenMP 的一个选项,OpenMP 是一个用于在进程中执行多线程的 C/C++/Fortran API。目前还不清楚这与 Python 多处理有什么关系。您的 Python 程序调用的模块是用 C 编写的,内部使用 OpenMP 吗?
  • 正确。那说明事情!所以,我猜该选项避免使用 python 多处理来调用另一个正在执行多处理的进程。

标签: python multiprocessing openmp


【解决方案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。)

【讨论】:

    【解决方案2】:

    在cmets中解决:

    OMP_NUM_THREADS 是 OpenMP 的一个选项,它是一种用于在进程中执行多线程的 C/C++/Fortran API。
    目前还不清楚这与 Python 多处理有什么关系。
    您的 Python 程序调用的模块是用 C 编写的,内部使用 OpenMP 吗? – 巫师

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多