【问题标题】:OpenMP: Working with Anaconda Python / Cython, but not with System (Arch) Python / CythonOpenMP:使用 Anaconda Python / Cython,但不使用 System (Arch) Python / Cython
【发布时间】:2018-04-05 11:55:43
【问题描述】:

我有一个 Python/Cython 应用程序,它使用 OpenMP 进行并行化,并多次调用英特尔 MKL。通常,我通过 OMP_NUM_THREADS=xx 确定线程数。当我使用 Anaconda 发行版(Python 3.6)运行我的脚本时,cython 脚本和 MKL(Pardiso 求解器调用)都正确启动了多个线程。在系统监视器中可以很好地看到 CPU 负载和加载的内核数。

但是,当使用系统 Python 发行版(Arch Linux 下的 Python 3.6)时,仅启动一个线程,用于 cython 模块和英特尔 MKL。

至少对于我的 cython 模块,我可以知道请求了正确数量的线程(通过 prange() ),但只获得了一个线程。

不会出现编译错误,当然标志“-fopenmp”用于编译。由于这个问题影响了我的 cython 模块和 Intel MKL,我认为它与我的系统 OpenMP 有某种关系。 这里有什么问题?谢谢!

【问题讨论】:

  • 系统 python 也将使用系统 openmp、编译器、工具链等。因此可能存在不适用于 anaconda 的系统的全局OMP_NUM_THREADS 设置。尝试在运行 python 脚本时手动设置该环境变量。
  • 没错,但这就是我已经做的:我通过 OMP_NUM_THREADS=... 设置环境变量。

标签: openmp cython


【解决方案1】:

尝试在循环之前指定代码内的线程数,以防OMP_NUM_THREADS在外部某处被覆盖,例如

import openmp
openmp.omp_set_num_threads(NumThreads)
# parallel loop here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    相关资源
    最近更新 更多