[转]Numpy使用MKL库提升计算性能
from:http://unifius.wordpress.com.cn/archives/5
系统:Gentoo Linux (64bit, Kernel 3.7.1)
配置:Intel(R) Core(TM) i7-2670QM
在Gentoo中安装Numpy/Scipy非常简单,直接emerge就可以解决。但是默认链接的blas/lapack库性能非常差,在矩阵计算方面比MATLAB慢了不少。原因在于MATLAB使用的是高度优化的数值计算库Intel math kernel library (MKL)。最新的MKL库在science overlay中有,安装后通过eselect blas/lapack set可以将系统默认链接的库设定为MKL(如mkl64-int64-dynamic-openmp)。设定之后再emerge numpy就可使用链接MKL库的numpy,而且可以发现svd等常用矩阵计算函数的速度大大提升。可问题是scipy无法emerge通过,查看log发现scipy无法检测到-lblas,即它根本没有识别系统默认链接库的设置。science overlay中blas/lapack库及其相关包的安装向来十分纠结,因为这里面似乎还没有完善的链接管理。这些问题持续了至少一年,近来才发现(部分)解决途径。
我们改换策略,手工安装numpy。首先获取最新的numpy包:git clone git://github.com/numpy/numpy.git numpy
然后进入到根目录。我们需要进行一些配置才能使numpy用上安装好的MKL库。这部分可以参考Intel官网的一个教程:
http://software.intel.com/en-us/articles/numpyscipy-with-intel-mkl
首先在根目录中加入site.cfg文件:
[mkl]
library_dirs = /opt/intel/mkl/composer_xe_2013/lib/intel64
include_dirs = /opt/intel/mkl/include
mkl_libs = mkl_rt
lapack_libs =
这里library_dirs与include_dirs是MKL的相关路径,注意各Linux发行版有细微区别。接下来修改numpy/distutils/intelccompiler.py中的cc_exe:
self.cc_exe = 'icc -O3 -g -fPIC -fp-model strict -fomit-frame-pointer -openmp -xhost'
以及numpy/distutil/fcompiler/intel.py中ifort的参数(最新版numpy里已经设置好了)。最后回到根目录进行编译:
sudo python2.7 setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem install
因为使用的是64位系统,所以是intelem。由于用到了Intel的c与fortran编译器(这二者也能带来性能的提升),编译前需要预先安装icc以及ifc(直接emerge即可安装)。注意,上述命令只编译了python2.7版本的,而之后系统编译scipy还需要py3k版本,所以还需要用python3.2再编译一次,这样两种版本的numpy就都安装在了系统中。至此我们已经从源码安装了numpy,且让其链接上了最新的MKL库。
现在产生了一个新的问题:使用emerge安装scipy等其他依赖numpy的包时系统会自动安装numpy,覆盖掉我们手工安装的numpy,这样就又回到了之前的老路子。这时Gentoo灵活的配置性就体现出来了,通过echo "dev-python/numpy-1.7.0" >> /etc/portage/profile/package.provided
我们可以告诉系统numpy的1.7.0版本已经手动安装好了,这样系统之后安装其他依赖包时就不会再动numpy了。当然,隔一段时间后numpy可能会发布新版本,这时更新系统会把已安装的numpy覆盖掉,所以要定期手动升级numpy。
上面这种方法的好处是最大程度保留了系统功能,让系统去自动处理尽量多的任务,留给我们的任务仅仅是每隔一段时间更新Numpy。使用python做普通科学计算,其性能主要由numpy决定,因此保证numpy的最优就足够。当然也可以手动编译所有python数值计算库,只是会在更新时多费些时间和精力。
实际测试中,这种方法安装的numpy的速度稍快于MATLAB,不过numpy与scipy的自带测试并没有全部通过。这并不影响基本使用,因此我还未探究原因何在。
[转]Numpy使用MKL库提升计算性能的更多相关文章
- 在Ubuntu 14.04 64bit上安装numpy和matplotlib库
原文:http://blog.csdn.net/tao_627/article/details/44004541 按照这个成功安装! 机器学习是数据挖掘的一种实现形式,在学习<机器学习实战> ...
- [笔记]我的Linux入门之路 - 05.Eclipse的Python开发环境搭建与Numpy、Scipy库安装
一.Python环境 直接终端查询下python安装没:python --version Python 2.7.12 Ubuntu竟然已经装了Python2.7,那就好说了.不然自己装和装jdk差不多 ...
- 如何在 code blocks中使用 mkl库
为了安装caffe, 所以安装了mkl, 现在想在codeblock的项目中使用mkl. 设置mkl环境变量: mkl安装好后默认是在/opt/intel/mkl中,其中/opt/intel/mkl/ ...
- ubuntu下python安装pandas和numpy等依赖库版本不兼容的问题RuntimeWarning: numpy.dtype size changed
习惯了linux下用pip install numpy及pip install pandas命令了.折腾了好久了. 上来先在python3中pip3 install numpy装了numpy,然后再p ...
- postgresql从库提升为主库
一.停主库 1.查看当前连接 select pid,datname,usename,client_addr,client_port, application_name from pg_stat_act ...
- MKL库奇异值分解(LAPACKE_dgesvd)
对任意一个\(m\times n\)的实矩阵,总可以按照SVD算法对其进行分解.即: \[A = U\Sigma V^T \] 其中\(U.V\)分别为\(m\times m.n\times n\)的 ...
- numpy科学计算库的基础用法,完美抽象多维数组(原创)
#起别名避免重名 import numpy as np #小技巧:print从外往内看==shape从左往右看 if __name__ == "__main__": print(' ...
- Numpy 和 Matplotlib库的学习笔记
Numpy介绍 一个用python实现的科学计算,包括:1.一个强大的N维数组对象Array:2.比较成熟的(广播)函数库:3.用于整合C/C++和Fortran代码的工具包:4.实用的线性代数.傅里 ...
- 利用Delphi-cross-socket 库提升kbmmw 跨平台开发
以前我写过了,通过httpsys 提升windows 下,delphi 多层应用.随着delphi 10.2 对linux 的支持,很多人也想在linux 下 发布kbmmw 服务器,但是官方仅通过i ...
随机推荐
- Android 5.0自定义动画
材料设计中的动画对用户的操作给予了反馈,并且在与应用交互时提供了持续的可见性.材料主题提供了一些按钮动画和活动过渡,Android 5.0允许你自定义动画并且可以创建新的动画: Touch Feedb ...
- Java 8新特性前瞻
快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...
- Javascript技巧实例精选(3)—用字符在屏幕上打印金字塔
用Javascript实现用★字符在屏幕上打印金字塔 >>点击这里下载完整html源码<< 这是最后的截图 这是相应的Javascript源码 //动态创建表格 var s=' ...
- 刚下载的几个开源的Android项目
Android-Universal-Image-Loader Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你. Universa ...
- Back to High School Physics - UVa10071
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/uva10071.html 题目描述 Pr ...
- KMP算法详解-- 转自Matrix67
6 7 8 9 -- A = a b a b 6 7 7 8 9 -- A = a b a b a 5 6 7 8 9 -- A = a b a b a b 6 7 ...
- 企业架构研究总结(45)——企业架构与建模之使用ArchiMate进行分析(全系列完)
4. 使用ArchiMate进行分析 正如前面所说的那样,一个企业整体效率的提升有时并不是通过某一个领域内的优化就能达到的,而且这种忽视全局的做法往往还会造成不必要的浪费.由此可见,一个能够跨越各个领 ...
- z-index 解析
很多人对z-index的认识仅止于:z-index是控制元素在页面中的堆叠顺序,z-index值高的元素显示在z-index值低的前面.而其中的原因才很少有人去深究,直到自己在实际项目中碰到由于z-i ...
- MongoDB学习之--增删改查(2)
昨天简单介绍了官方驱动操作MongoDB进行增删查操作的,今天继续介绍更新操作..... 方法简介 官方驱动中更新操作使用collection的Update方法,有泛型和非泛型两个版本: 其签名如下( ...
- java判断字符串是否为乱码
项目中有一个功能 在IE中GET方式提交会产生乱码 但有两个入口都会走这同一段代码 固不能直接转码,所以要进行判断传过来的该值是不是乱码 可用以下方式验证: java.nio.charset.Char ...