我正在运行python脚本,我收到此错误:
Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
Run Code Online (Sandbox Code Playgroud)
这两个文件都存在于anaconda2/lib目录中.我该如何解决这个错误?谢谢.
我正在使用针对英特尔数学核心库构建的NumPy.我使用virtualenv,通常使用pip来安装包.
但是,为了让NumPy找到MKL库,必须在编译之前在NumPy源目录中创建一个site.cfg文件,然后手动构建和安装.我可以编写整个过程的脚本,但我希望有一个更简单的解决方案.
我有一个标准的site.cfg文件,可以在版本控制下用于此目的.是否有任何pip命令行选项会告诉它在构建包之前将特定文件复制到源目录?
或者,是否可以设置任何环境变量而不是在site.cfg文件中提供库路径?这是我使用的site.cfg文件.它几乎逐字逐句地从英特尔网站上获取.
[mkl]
library_dirs = /opt/intel/composer_xe_2013.1.117/mkl/lib/intel64
include_dirs = /opt/intel/composer_xe_2013.1.117/mkl/include
mkl_libs = mkl_rt
lapack_libs =
Run Code Online (Sandbox Code Playgroud)
作为参考,我正在运行Ubuntu,Python 2.7和NumPy 1.6.
UPDATE
不幸的是,由于我的疏忽,我有一个旧版本的MKL(11.1)链接到numpy.较新版本的MKL(11.3.1)在C中和从python调用时具有相同的性能.
什么是模糊的东西,即使将编译的共享库与新的MKL明确地链接,并将LD_*变量指向它们,然后在python中执行import numpy,以某种方式使python调用旧的MKL库.只有在python lib文件夹中替换所有libmkl _*.所以使用更新的MKL我能够匹配python和C调用中的性能.
背景/图书馆信息.
矩阵乘法是通过numpy.dot函数通过sgemm(单精度)和dgemm(双精度)Intel的MKL库调用完成的.可以使用例如oprof来验证库函数的实际调用.
在这里使用2x18核心CPU E5-2699 v3,因此共有36个物理核心.KMP_AFFINITY =散射.在linux上运行.
TL; DR
1)为什么numpy.dot,即使它调用相同的MKL库函数,与C编译代码相比,最好慢两倍?
2)为什么通过numpy.dot随着内核数量的增加而性能下降,而在C代码中没有观察到相同的效果(调用相同的库函数).
问题
我观察到在numpy.dot中进行单/双精度浮点矩阵乘法,以及直接从编译的C 共享库调用cblas_sgemm/dgemm,与从纯C内部调用相同的MKL cblas_sgemm/dgemm函数相比,性能明显更差码.
import numpy as np
import mkl
n = 10000
A = np.random.randn(n,n).astype('float32')
B = np.random.randn(n,n).astype('float32')
C = np.zeros((n,n)).astype('float32')
mkl.set_num_threads(3); %time np.dot(A, B, out=C)
11.5 seconds
mkl.set_num_threads(6); %time np.dot(A, B, out=C)
6 seconds
mkl.set_num_threads(12); %time np.dot(A, B, out=C)
3 seconds
mkl.set_num_threads(18); %time np.dot(A, B, out=C)
2.4 seconds
mkl.set_num_threads(24); %time np.dot(A, B, out=C)
3.6 seconds
mkl.set_num_threads(30); %time np.dot(A, B, out=C)
5 …Run Code Online (Sandbox Code Playgroud) 我是一名工程专业的学生,目前正在从MATLAB过渡到Python,用于数值模拟.我的印象是,对于基本的数组操作,Numpy会和MATLAB一样快.但是,对于我写的两个不同的程序来说,MATLAB的速度是Numpy的两倍.我用于Numpy(Python 3.3)的测试代码是:
import numpy as np
import time
a = np.random.rand(5000,5000,3)
tic = time.time()
a[:,:,0] = a[:,:,1]
a[:,:,2] = a[:,:,0]
a[:,:,1] = a[:,:,2]
toc = time.time() - tic
print(toc)
Run Code Online (Sandbox Code Playgroud)
鉴于我正在使用的MATLAB 2012a:
a = rand(5000,5000,3);
tic;
a(:,:,1) = a(:,:,2);
a(:,:,3) = a(:,:,1);
a(:,:,2) = a(:,:,3);
toc
Run Code Online (Sandbox Code Playgroud)
我使用的算法是在NASA 网站上使用的比较Numpy和MATLAB的算法.该网站显示Numpy在该算法的速度方面超过了MATLAB.然而,我的结果显示Numpy的模拟时间为0.49秒,MATLAB的模拟时间为0.29秒.我也在Numpy和Matlab上都运行了Gauss-Seidel解算器,我得到了类似的结果(16.5 s vs 9.5 s)
我是Python的新手,并且在编程方面不是非常有文化.我正在使用WinPython 64位Python发行版,但也试过Pythonxy无济于事.
我读过一篇应该提高性能的方法是使用MKL构建Numpy.不幸的是我不知道如何在Windows上执行此操作.我甚至需要这样做吗?
有什么建议?
我正在使用PIP安装Scipy和MKL来加速性能.我的操作系统是Ubuntu 64位.使用此问题的解决方案,我创建了一个文件.numpy-site.cfg
[mkl]
library_dirs=/opt/intel/composer_xe_2013_sp1/mkl/lib/intel64/
include_dirs=/opt/intel/mkl/include/
mkl_libs=mkl_intel_lp64,mkl_intel_thread,mkl_core,mkl_rt
lapack_libs=
Run Code Online (Sandbox Code Playgroud)
这个文件帮助我成功安装Numpy和MKL.但是,使用相同的上述文件,安装Scipy会提示错误
ImportError: libmkl_rt.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)
我也用
export LD_LIBRARY_PATH=/opt/intel/composer_xe_2013_sp1/mkl/lib/intel64
Run Code Online (Sandbox Code Playgroud)
但问题仍然是一样的.
有谁知道如何解决这个问题?我不想手动安装Scipy所以任何人都给我一些提示来解决它.
使用替代BLAS for R有几个优点,例如https://cran.r-project.org/web/packages/gcbd/vignettes/gcbd.pdf.
Microsoft R Open https://mran.revolutionanalytics.com/documents/rro/installation/#sysreq使用Intel的MKL而不是默认的Reference BLAS来加速计算.
我的问题是:
将英特尔的MKL库**手动链接到R**在Windows上的最新版本(https://cran.r-project.org/bin/windows/base/)的确切步骤是什么?
更新20-07-2016: 这里有关于如何为R≥3.3.0的Windows 64位R构建基于OpenBLAS的Rblas.dll的详细说明:http://www.avrahamadler.com/r-tips /集结openblas换窗户-R64 /
我正在使用Enthought的Canopy/EPD版本的python,它附带了与MKL相关联的numpy.我目前在我的工作计算机(Windows 7,四核i5 @ 3.33 Ghz,4 GB RAM)和我的家庭工作站(Mac Pro 3.1,Ubuntu 12.04,2x四核Xeon)上并行运行一组模拟(使用PP) @ 2.8 Ghz,6 GB ram).
但是当我对我的模拟进行基准测试时,它们在工作计算机上的运行速度要快得多(每次迭代35秒,而在mac pro上为60秒).问题是核心(易并行问题)之间完美的平衡,所以我怀疑是家里的Linux工作站上的MKL库的问题.有没有办法验证MKL库实际上是否在python中使用.我已经读过线程,说你可以检查python是否链接到它,但它不能确保它是正确构建的并且实际上正在使用.
我试图mkl_set_num_threads像这样设置numpy计算的线程数
import numpy
import ctypes
mkl_rt = ctypes.CDLL('libmkl_rt.so')
mkl_rt.mkl_set_num_threads(4)
Run Code Online (Sandbox Code Playgroud)
但我不断收到分段错误:
Program received signal SIGSEGV, Segmentation fault.
0x00002aaab34d7561 in mkl_set_num_threads__ () from /../libmkl_intel_lp64.so
Run Code Online (Sandbox Code Playgroud)
获取线程数是没问题的:
print mkl_rt.mkl_get_max_threads()
Run Code Online (Sandbox Code Playgroud)
如何让我的代码工作?或者是否有其他方法可以在运行时设置线程数?
我发现,numpy.sin当参数大小小于等于8192且大于8192时,行为会有所不同。性能和返回的值都不同。有人可以解释这种影响吗?
例如,让我们计算sin(pi / 4):
x = np.pi*0.25
for n in range(8191, 8195):
xx = np.repeat(x, n)
%timeit np.sin(xx)
print(n, np.sin(xx)[0])
Run Code Online (Sandbox Code Playgroud)
64.7 µs ± 194 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
8191 0.7071067811865476
64.6 µs ± 166 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
8192 0.7071067811865476
20.1 µs ± 189 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
8193 0.7071067811865475
21.8 …Run Code Online (Sandbox Code Playgroud) 在我的Anaconda Python发行版上,复制一个16 GB或更大的Numpy数组(无论dtype如何)都会将副本的所有元素设置为0:
>>> np.arange(2 ** 31 - 1).copy() # works fine
array([ 0, 1, 2, ..., 2147483644, 2147483645,
2147483646])
>>> np.arange(2 ** 31).copy() # wait, what?!
array([0, 0, 0, ..., 0, 0, 0])
>>> np.arange(2 ** 32 - 1, dtype=np.float32).copy()
array([ 0.00000000e+00, 1.00000000e+00, 2.00000000e+00, ...,
4.29496730e+09, 4.29496730e+09, 4.29496730e+09], dtype=float32)
>>> np.arange(2 ** 32, dtype=np.float32).copy()
array([ 0., 0., 0., ..., 0., 0., 0.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
这是np.__config__.show()为了这个分布:
blas_opt_info:
library_dirs = ['/users/username/.anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/users/username/.anaconda3/include'] …Run Code Online (Sandbox Code Playgroud)