ChemiAndy

Core单机编译串行CPMD3.13.2 with Intel MKL10.2.1

因为要在自己的笔记本上测试一些CPMD输入文件,以便更顺利地提交到服务器,所以决定在自己的笔记本上安装CPMD3.13.2。因为原先在多个服务器上成功的编译过CPMD,还写过一些教别人编译的帖子,所以以为不会太难。事实证明这个过程比预想的要艰苦许多。前后花了3个晚上,中间几乎放弃, 所以编译成功以后格外高兴,并且把要点写下面,以便别人参考。

我相信串行版本的编译要比并行的要简单一些,不过编译过CPMD的都知道,问题往往不在串行并行,最困难的是Makefile中LFLAG的配置。CPMD官方Maillist 上关于安装的绝大多数问题被证明是这个LFLAG的配置不正确。这源于不同的硬件,操作系统和编译环境的搭配。LFLAG的主要目的是告诉编译期如何静态或者动态地连接数学库,而数学库则是CPMD类科学计算软件的核心。下面的讨论不是全面的,它并不能提供一个完全的安装指导。因为我本人对编译期和数学库的使用也不是很熟悉,我只是将我在这此编译中的一些要点写下来,为那些摸索中的人提供一点线索。

我的硬件环境:富士通S7211,CPU Core T2390, 2G Mem

软件环境:openSUSE11,1, intelFortran/C++Compiler11.1, MKL10.2

安装过程:

1。 先下载安装 intel FORTRAN compiler编译器;和intel MKL数学库(即LPACK/BLAS,我并不清楚这两个东西的功能和含义,但他们对CPMD的编译至关重要).

intel FORTRAN compiler是商业软件,所以安装比较简单的:

>./configure

>make install -

然后编辑用户跟目录下的peizhiwenjian.bashrc,设置他们的环境变量,

清一定要阅读上面三个软件包中的 doc目录下的userguide.pdf,查看get started部分,上面详细说明了你要在.bashrc文件中如何source环境变量文件,并且如何添加平台参数。

我在这里添加的分别是:

#Souce of intel FORTRAN and C++, MKL environment variables

source /opt/intel/Compiler/11.1/046/bin/iccvars.sh ia32

source /opt/intel/Compiler/11.1/046/bin/ifortvars.sh ia32

source /opt/intel/mkl/10.2.1.017/tools/environment/mklvars32.sh

 

2。 然后下载解压CPMD3.13.2的包,进入SOURCE文件夹进行编译;

编译分三步:

(1) 选择平台类型,配置Makefile

> ./config.sh -i

可以查看供选预处理平台类型,选择最接近你的,这里我选择的是PC-IFC-P4. IFC指采用intel fortran编译器ifort (以前叫ifc), then

> ./config.sh PC-IFC-P4 > Makefile

(2) 编辑Makefile,设置LFLAGS,然后

>make

设置LFLAGS这一步最关键。首先,-L后面加MKL路径: /opt/intel/mkl/10.2.1.017/lib/32(不是Compiler下面的MKL库的路径);

自动生成的LFLAGS几乎没有任何价值,编译总是不通过。提示:"can not find -llapack-ifc", 去官方maillist里面搜索,发现使用intel MKL10.2应该将"-llapack-ifc"改成"-lmkl_lapack -lmkl_ia32", 修改后提示"Cannot find -lmkl_ia32",这下傻眼了,于是一直想搜一个跟我机器和软件配置差不多的LFLAGS用一下,这个尝试花了我大量时间,无一成功。再次说明,不理解那些flag是不行的。

看CPMD手册,强调要有lapack和blas,但是只有-lmkl_lapack -lmkl_blas95是不行的,提示缺少“lapack: undefined reference to `xxx”,maillist上Axel说这是lapack要用的一些子程序没有加进来;有一个提示很关键,说要“link full tree of MKL”,我就尝试把一些MKL库目录 /opt/intel/mkl/10.2.1.017/lib/32下的 .so .a文件的名字按照 -lmkl_xxx的格式加进去,提示错误数开始减少,说明有效,于是不断添加。一般是把libmkl_xxx.a 改成 -lmkl_xxx作为flag;有的文件名不是这个格式,就直接把完整的路径和文件名写下,如

 /opt/intel/mkl/10.2.1.017/lib/32/libiomp5.a

几乎把全部文件加进去后,还是有一个错误提示不消失,“undefined reference to `pthread_atfork'”;百度之,说要加一个-lpthread,还是不行,再搜,又有人说不是lpthread,而是pthread,一改,居然编译通过。

 

后来,我又尝试把那些加上去的flag一个个去掉,看看那些是必须的,那些不是。发现的确有一些俄是不必要的。最后的LFLAGS结果件下面:

#--------------- Default Configuration for PC-IFC-P4 ---------------

SRC = .

DEST = .

BIN = .

FFLAGS = -c -w90 -w95 -O2 -pc64 -unroll -tpp7

LFLAGS = -L/opt/intel/mkl/10.2.1.017/lib/32 -lmkl_lapack -Vaxlib \

-lmkl_blas95 -lmkl_core -lmkl_intel -pthread -lmkl_cdft_core \

-lmkl_gnu_thread -lguide /opt/intel/mkl/10.2.1.017/lib/32/libiomp5.a

CFLAGS = -c -O2 -Wall

CPP = /lib/cpp -P -C -traditional

CPPFLAGS = -D__Linux -D__PGI -DFFT_DEFAULT -DLINUX_IFC -DINTEL_MKL

NOOPT_FLAG =

CC = icc

FC = ifort

LD = ifort -i-static

AR = ar


3。 另:"libstdc++.so.5 错误

make时曾遇到了如下出错提示:"libstdc++.so.5: cannot open shared object file: No such file or directory"

网上一搜,这里(https://hi.baidu.com/keepzeal/blog/item/f58a1bde951c0d5ecdbf1a4c.html)提示缺少这个包,安装https://mirror.centos.org/centos/4/os/i386/CentOS/RPMS/compat-libstdc++-33-3.2.3-47.3.i386.rpm, 安装以后出错提示消失。

 

Xijun Wang, 2009.09.03 Mt

 

摇摇摆摆的路@QQ-CPMD Group:

官方手册上的顺序:

 

<files to link>

-L<MKL path> -I<MKL include>

[-lmkl_lapack95] [-lmkl_blas95]

[cluster components]

 

[{-lmkl_{intel, intel_ilp64, intel_lp64, intel_sp2dp, gf, gf_ilp64, gf_lp64}]

[-lmkl_{intel_thread, gnu_thread, pgi_thread, sequential}]

[{-lmkl_solver, -lmkl_solver_lp64, -lmkl_solver_ilp64}]

{{[-lmkl_lapack] -lmkl_{ia32, em64t, ipf}},

-lmkl_core}}

[{-liomp5, -lguide}] [-lpthread] [-lm]

此外intel_thread.a 是为并行intel编译器用的 串行应该用sequential.a

修改: 2010.4.7

评论