我有一个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模块以及英特尔MKL,我认为它与我的系统OpenMP有某种关系。 这是什么问题?谢谢!
答案 0 :(得分:0)
尝试在循环之前指定代码内部的线程数,以防OMP_NUM_THREADS
被覆盖在外面,例如
import openmp
openmp.omp_set_num_threads(NumThreads)
# parallel loop here