高性能计算

ifc9.0+MKL8.0+MPICH2在opteron平台VASP的并行编译(zz)

2010年3月26日 阅读(559)

1. 说明(可略过)
    由于条件限制,我们作的并行只是应用层的并行(包括现在量化网上关于并行的文章,说的也都是应用层的并行);如果有条件的话,可以考虑组建Beowulf,COW,MOSIX,或其他商业的群集系统. 我们说要在应用层实现并行,主要就是通过一些网络协议(如TCP/IP)实现并行群集系统中各个节点间消息的传递,而MPI为此提供了传递接口.

    现在最常见的MPI有MPICH和LAM-MPI: LAM-MPI最主要的特性是可以实现不同平台之间的并行,MPICH由Argonne国家实验室负责开发和维护. 因为我们现在在所有接点上装的都是Linux,所以采用MPICH. 现在MPICH的版本有MPICH1和MPICH2, MPICH1的公开最新版本是1.2.7p1,MPICH2的公开最新版本是1.0.3. 可以说MPICH2对MPI作了全新的实现,也加入了许多新的特性,虽然MPICH2也提供了一些兼容MPICH1的指令和参数(这个下面还会提及); 所以除非有一些特殊需要, 譬如要实现64位机器跟32位机器的并行,暂时还得用MPICH1外, 都建议使用MPICH2.
   
    另外,本文将要介绍的都是针对Linux系统说的,但对于各类Unix系统都有自己的编译器,请参考其相应的说明文档,并最后使用vasp提供的相应的makefile。
   
   
2. 并行的实现(如果并行系统已装好了的,可略过)
     假设各个接点上都已装好了Linux系统,并通过网卡和交换机组建了内部局域网(建议主节点和分节点都使用千兆网卡,交换机建议用个高档的千兆交换机,有条件的话,可以考虑Cisco或华为的,以保证节点间无通信瓶颈). 因为本文的主要目的还是讲VASP的编译,所以一些题外话就不多说了,下面简要列出实现并行的步骤:
     <各个节点的服务和网络配置:>
     要启动的服务包括nfs,nis,sshd(不建议用rsh),并设置好共享目录(建议直接共享/home目录,以后会方便许多,同时编辑各个分节点的fstab文件,加入这个共享目录,这样每次重启后,就能自动mount上了),编辑hosts文件(各个node和ip的对应关系),在主节点上给每个要使用并行的用户用ssh-keygen生成用于节点间登录访问的私钥private key和公钥public key, 然后将公钥譬如~/.ssh/id_dsa.pub或者~/.ssh/id_rsa.pub文件中内容加入到~/.ssh/authorized_keys文件中。配置好后,现在应该就可以使用如ssh node1(你给各个节点取的名字)直接登录到分节点上,而不提示输入用户名和密码。:)如果以上有不明白的话,请参考其他关于组建并行系统的文章,这个基本类似,就不赘述了。
    
3. 在主节点上安装编译器、数学库和mpich
     (注意以下所有的程序都最好安装到/home目录下,因为前面提过我们把它已经通过NFS共享,这样子各个分节点就不用分别安装配置了)
     在Linux上支持CRAY POINTER的fortran90/95编译器常见的有intel的ifc,pgi的pgf,还有Absoft,Lahey/Fujitsu等(均为商业软件),本文使用ifc;我们最常用的数学库有LAPACK/BLAS/ATLAS库和FFTW库,这些都能找着免费的…对于intel或AMD的PC平台来说,个人建议或者自己编译各个数学库,或者采用已经对你的硬件平台作过优化的商业版本。本文使用intel的mkl,已经集合了LAPACK/BLAS/ATLAS库…
     编译器和数学库的安装比较简单,如有疑问,请参阅相应编译器或数学库的主页,一般都有详细的说明文档。安装完后,请设置好几个环境变量,并根据实际平台,选用相应的编译器版本,如64位的还是32位的(虽然现在无论intel还是AMD的64位CPU都能向下兼容32位)
    
     下面开始安装MPICH. 刚才提到过MPICH2和MPICH1有很大不同,编译mpich2的预处理参数配置跟mpich1也大不一样(因为现在网上的大多数文章使用的都还是MPICH1,所以下面对MPICH1和MPICH2的区别稍详细说明一下),譬如在MPICH1中预处理时可以这样:
     ./configure -fc=ifort
     可以把所有的编译参数都加到一行,但这在MPICH2中就不行,在MPICH2中必须在编译前就设置相应的环境变量,如
     export FC=ifort
     才可以;所以按这个思路,大家只要把网上其他关于安装MPICH1时用的“大多数”编译参数改一下,就可以安装MPICH2了,这样子就又简单了。因为关于MPICH1的编译文章很多了,所以大家只要根据各自的平台和选用的编译器作相应修改设置变量就可以了. 然后在mpich2的source目录下,简单的
     ./configure –prefix=/home/mpich
     就可以了, 这样会把mpich2安装到/home/mpich目录下. 当然这里MPICH2跟MPICH1还有别的一些差别,如果没有特殊要求,我们可以暂时不必细究.
     接着
     make && make install
     看如果输出一切正常的话,再检查一下在/home/mpich/bin目录下是不是生成了mpif90,mpif77,mpirun,mpiexec等可执行文件.
     然后也别忘了在$PATH变量中加入这个新装的MPICH2的路径.
     关于MPICH2的调试就不细说了,大家可以参阅MPICH2主页上的那两个文档.
    
4. 安装vasp.lib和vasp
      vasp.lib的安装跟往常一样,只要最后生成libdmy.a就可以了.
      然后进入vasp目录,根据实际平台和编译器选择相应的makefile进行编辑,譬如我们用makefile.linux_ifc_opt复制成makefile,下面我们对这个makefile进行编辑,主要修改的几个地方如下:
      FC = mpif90
      #选择我们用mpich下重新编译的fortran90
      OFLAG=-O2 -xW -tpp7
      #编译优化参数,根据我们实际平台选择
      BLAS  = -L/home/[your_mkl_library_directory] -lmkl_em64t -lguide -lpthread
      LAPACK= -lmkl_lapack
      LINK  = -lsvml -L/home/[your_mkl_library_directory]
      CPP   = $(CPP_) -DMPI  -DHOST=\"LinuxIFC\" -DIFC -Dkind8 -DNGZhalf -DCACHE_SIZE=4000 -DPGF90 -Davoidalloc -DMPI_BLOCK=2000 -Duse_cray_ptr
      FFT3D = fftmpi.o fftmpi_map.o fft3dlib.o
      修改完后,保存一下
      再make && make install就可以了
     
      另外,如果用的是自己编译的FFTW库的话,记得把fftw3.f也拷贝到当前目录.

      如果按上面执行顺利的话,我们就可以得到并行版的vasp了.
      本文在opteron+64位Linux平台上作过测试,可以支持2GB/4GB以上内存.
      
      版本说明(均为现在公开最新版本,列出来便于大家找寻或采购):
      MPICH1 1.2.7p1
      MPICH2 1.0.3
      IFC    9.0.031
      MKL    8.0.1.006
      FFTW   3.1.1
     
5. 题外话(可略过)
      因为写得比较仓促,也尽量避免与其他文章雷同, 所以这篇文章有几处细节只是指出了可以找到参考的地方,也有些地方可能说得还不够清楚,以后若有机会的话,希望再把各方面讲得更具体些,更全一些,那样可能会让更多的人受益, :)…

You Might Also Like