[转]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 ...
随机推荐
- Confluence, JIRA, Fisheye
[tools]迁移Confluence, JIRA, Fisheye [背景] 原先的Confluence, JIRA, Fisheye都部署在一台服务器(192.168.200.203)上,导致 ...
- SZU:B54 Dual Palindromes
Judge Info Memory Limit: 32768KB Case Time Limit: 10000MS Time Limit: 10000MS Judger: Number Only Ju ...
- 用自己的话表达出来-Servlet
什么是Servlet Servlet就是工作在服务器端的类,该类可以处理用户传过来的请求,也可以通过响应向用户输送数据. 如何使用Servlet Servlet就是处理用户的HTTP请求,然后回送HT ...
- 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二)
基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)介绍(二) 之前文章中给大家说明了下我这个小小的想法,发现还是有不少人的支持和关注.你们的鼓励是对我最大的支持. 我总结了了 ...
- What skills are needed for machine learning jobs
What skills are needed for machine learning jobs?机器学习工作必须技能 原文: http://www.quora.com/Machine-Learnin ...
- AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由)
AspNetWebApi管线中如果定义两种类型的消息处理程序(全局/路由) 在AspNetWebApi管线中存在两种类型的消息处理程序(Message Handler) 1.全局消息处理程序,所有的请 ...
- 搜索广告与广告网络Demand技术-搜索广告
搜索广告 搜索广告就是一个典型的Ad Network,但是搜索广告非常重要,它的收入非常高,所以它有其独特之处,复杂度也比展示广告要高.它与展示广告在点击率预测,检索部分差不多,它的特点:1. 用户定 ...
- Rustlang语言逐行处理文件的基本方法
文件操作 需求: 将文件中的内容按行读取出来,然后对改行的数据进行处理,最后将处理后的行数据存放到新的文件中. 使用RUST来处理的方法如下. 首先引入需要的标准库: use std::io::pre ...
- CodeBlocks的下载安装、配置、简单编程
CodeBlocks的下载安装.配置.简单编程 IDE简介 http://www.baidu.com/s?wd=codeblocks ,这里只是介绍Windows平台下的IDE环境配置. CodeBl ...
- 新软件马上就要完成了,先发篇文章YY下
最近一直都在搞网站抓取方面的开发,闲着无聊逛逛论坛,发现有些帖子还是写的相当不错的,只是一篇一篇的点进去比较麻烦,于是就写了个小软件只是为了方便查看博客园和CSDN上的优秀文章.其实这个还可以拓展的, ...