Ubuntu中的MKL多线程需要提升权限

时间:2018-03-07 16:55:10

标签: python linux multithreading ubuntu intel-mkl

我在Ubuntu(16.04.4)下安装了英特尔的Python发行版(3.6.3)。如果我以root身份运行此python,以下代码显示我的MKL_NUM_THREADS环境变量正在被尊重:

import numpy
import ctypes
mkl_rt = ctypes.CDLL('libmkl_rt.so')
mkl_rt.mkl_get_max_threads()  # returns MKL_NUM_THREADS
A = numpy.random.rand(10000, 10000)
A2 = A.dot(A)                 # uses MKL_NUM_THREADS threads

但是,如果我以普通用户身份运行此python,mkl_get_max_threads将返回1,矩阵乘法仅使用一个CPU线程。

作为解决方法,我尝试了以下方法:

num_threads = MKL_NUM_THREADS - 1
mkl_rt.mkl_set_num_threads(ctypes.byref(ctypes.c_int(num_threads)))

无论我是否以root用户身份运行python,mkl_set_num_threads调用都没有效果:mkl_get_max_threads仍返回与调用前相同的值,以及numpy使用的CPU内核数量没有改变。

如何让英特尔MKL作为普通用户使用MKL_NUM_THREADS

1 个答案:

答案 0 :(得分:1)

我们在虚拟机和主机上尝试过相同的操作,我们得到了以下观察结果:

  1. 在虚拟框 image of code executed in virtual box

  2. 中执行的代码
  3. 虚拟框CPU信息 Image of Virtual box CPU info

  4. 在主机 Image of code executed in Host machine

  5. 中执行的代码
  6. 主机CPU信息Image of Host machine CPU info

  7. 有关从多线程应用程序调用英特尔MKL例程的推荐设置的更多参考,请参阅以下链接:

    https://software.intel.com/en-us/articles/recommended-settings-for-calling-intel-mkl-routines-from-multi-threaded-applications