我在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
?
答案 0 :(得分:1)
我们在虚拟机和主机上尝试过相同的操作,我们得到了以下观察结果:
虚拟框CPU信息 Image of Virtual box CPU info
有关从多线程应用程序调用英特尔MKL例程的推荐设置的更多参考,请参阅以下链接: