NumPy和SciPy目前广泛应用于数学计算、分析领域,Intel的MKL是一个数学库,可以实现高速和并行计算功能。本例中,我将用CentOS6(已安装python2.7)安装Intel Parallel Studio XE 2015 Cluster Edition软件,使用Intel编译器和MKL编译NumPy和SciPy。
CentOS6下安装Python2.7的教程我们之前提到过,这里就不赘述了。
安装Intel Parallel Studio XE 2015 Cluster Edition
新建文件夹作为挂载点:
[root@template ~]# mkdir /mnt/iso
正是挂载iso文件:
[root@template ~]# mount -o loop Intel.Parallel.Studio.XE.2015.Cluster.Edition.Linux.iso /mnt/iso
开始安装:
[root@template ~]# /mnt/iso/install.sh
整个安装过程注意看提示说明,安装的组件,路径等信息,默认路径是/opt/intel,我们此次采用的就是默认路径。
由于Intel编译器默认没有安装在/usr/bin等标准的路径下,所以你无法直接使用icc等命令,同样,要运行与intel库链接的程序,必须保证链接器可以通过环境变量LD_LIBRARY_PATH来查找库。可以通过如下命令来临时设置下环境变量:
[root@template ~]# source /opt/intel/bin/iccvars.sh intel64 -platform linux
或者自己手动指定也可以:
export LD_LIBRARY_PATH=/opt/intel/composer_xe_2015.0.090/compiler/lib/intel64:/opt/intel/composer_xe_2015.0.090/mpirt/lib/intel64:/opt/intel/composer_xe_2015.0.090/ipp/lib/intel64:/opt/intel/composer_xe_2015.0.090/mkl/lib/intel64:/opt/intel/composer_xe_2015.0.090/tbb/lib/intel64/gcc4.4:$LD_LIBRARY_PATH
注意:我这里手动设置变量中的路径都是绝对路径。
测试下intel编译器:
[root@template ~]# icc -v icc version 15.0.0 (gcc version 4.4.7 compatibility)
编译numpy
下载numpy源码包:numpy-1.11.2.tar.gz
解压并cd到源码目录:
[root@template ~]# tar xf numpy-1.11.2.tar.gz [root@template ~]# cd numpy-1.11.2/ [root@template numpy-1.11.2]#
复制一份site.cfg文件
[root@template numpy-1.11.2]# cp site.cfg.example site.cfg
编辑site.cfg文件,添加如下信息:
[mkl] library_dirs = /opt/intel/mkl/lib/intel64/ include_dirs = /opt/intel/mkl/include/ mkl_libs = mkl_rt lapack_libs =
编辑源码子目录的numpy/distutils/intelccompiler.py文件:
原先的内容:
self.cc_exe = ('icc -fPIC -fp-model strict -O3 ' '-fomit-frame-pointer -openmp')
变成这样:
self.cc_exe = ('icc -fPIC -fp-model strict -O3 ' '-fomit-frame-pointer -openmp -xHost')
修改numpy源码字母的numpy/distutils/fcompiler/intel.py文件,查找IntelEM64TFCompiler标签,把下面的内容修改下:
def get_flags_arch(self): return ['']
修改成:
def get_flags_arch(self): return ['-xHost']
编译:
[root@template numpy-1.11.2]# python setup.py \ > config --compiler=intelem --fcompiler=intelem \ > build_clib --compiler=intelem --fcompiler=intelem \ > build_ext --compiler=intelem --fcompiler=intelem
上面的编译命令后面可以直接加上install,直接编译完成后安装,我们此处没有这样。
安装下:
[root@template numpy-1.11.2]# python setup.py install
要安装在别的目录,可以在后面加上–prefix标签,例如要安装在用户自己的home目录:
python setup.py install --prefix=~
要使用这些安装在非标准目录的包,可以设置下环境变量:
export PYTHONPATH=~/lib/python2.7/site-packages
编译SciPy
先下载scipy源码包scipy-0.18.1.tar.gz,再解压并切换到源码目录:
[root@template ~]# tar xf scipy-0.18.1.tar.gz [root@template ~]# cd scipy-0.18.1/ [root@template scipy-0.18.1]#
编译安装:
python setup.py config --compiler=intelem --fcompiler=intelem build_clib --compiler=intelem --fcompiler=intelem build_ext --compiler=intelem --fcompiler=intelem
还是和以前一样,如果想编译之后直接安装,可以在上面的代码最后加上install即可,此处我们先编译测试下。
正式安装下:
[root@template scipy-0.18.1]# python setup.py install
还是和上面一样,如果要安装在用户自己的home目录,则使用:
python setup.py install --prefix=~
可以用测试脚本测试下:
import numpy as np import time N = 6000 M = 10000 k_list = [64, 80, 96, 104, 112, 120, 128, 144, 160, 176, 192, 200, 208, 224, 240, 256, 384] def get_gflops(M, N, K): return M*N*(2.0*K-1.0) / 1000**3 np.show_config() for K in k_list: a = np.array(np.random.random((M, N)), dtype=np.double, order='C', copy=False) b = np.array(np.random.random((N, K)), dtype=np.double, order='C', copy=False) A = np.matrix(a, dtype=np.double, copy=False) B = np.matrix(b, dtype=np.double, copy=False) C = A*B start = time.time() C = A*B C = A*B C = A*B C = A*B C = A*B end = time.time() tm = (end-start) / 5.0 print ('{0:4}, {1:9.7}, {2:9.7}'.format(K, tm, get_gflops(M, N, K) / tm))
结果如下:
64, 0.08944516, 85.19186 80, 0.09361682, 101.9048 96, 0.105599, 108.5237 104, 0.1081362, 114.8552 112, 0.1157708, 115.5732 120, 0.1222016, 117.3471 128, 0.1230086, 124.3816 144, 0.1358574, 126.7506 160, 0.1499454, 127.6465 176, 0.1642118, 128.249 192, 0.1824996, 125.9181 200, 0.1848712, 129.4956 208, 0.1959402, 127.0796 224, 0.2016638, 132.9936 240, 0.265302, 108.3294 256, 0.281865, 108.7755 384, 0.3804388, 120.9656
已经安装了基于Intel编译器和MKL构建NumPy和SciPy后,如果想安装普通的numpy和scipy,可以用pip来安装,例如,把numpy安装在home目录:
pip install --install-option="--prefix=~" --ignore-installed numpy
安装完后,用户的home目录的lib文件夹下,就是安装的numpy软件了。