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软件了。

基于Intel编译器和MKL构建NumPy和SciPy教程
Tagged on:                     

发表评论

电子邮件地址不会被公开。 必填项已用*标注