首页 > Chemistry > Archlinux 下 ICC+MKL 方案编译 GAMESS

Archlinux 下 ICC+MKL 方案编译 GAMESS

[总点击:716次]
2010年1月16日

点此下载效果更好的 pdf 版本

                    Archlinux 下 ICC+MKL 方案编译安装 GAMESS
                                作者: xiooli
                                邮箱: <xioooli[at]yahoo.com.cn>
                                网站: http://joolix.com

    此文系根据自己实际操作写就,其中查考了 Sobereva 和王涛的文章 (见参考文献)
    在此表示感谢。
    本文依据 CC 协议发布,在保留原作品的署名的情况下你可以自由转载或修改再发布
    (仅限非商业用途)

—————————————正文—————————————
一,机器配置
    型号: lenove ThinkCenter M8000t
    主板: Intel Q45
    CPU:    Intel(R) Core(TM)2 Quad CPU Q9550 @ 2.83GHz (四核)
    内存: DDR3 1066MHz 2G X 2
    硬盘:   SATA 500G 7200RPM

二,系统及编译环境
    系统: Archlinux x86_64
    内核: 2.6.32-ARCH
    SHELL:
        bash:   version 4.0.35(2)-release
            这是用户的默认登录 shell,编译操作基本上都是在 bash 里面完成的
        csh:    tcsh 6.17.00 (Astron) 2009-07-10
            因 gamess 的很多脚本是用 csh 写成,故而需要安装 csh (包名是 tcsh)
    C 编译器:
        GCC:    4.4.2 20091208 (prerelease)
            GCC 是默认的编译器,可以从你发行版的软件源里面安装
        ICC:    Version 11.1
            intel 的 CPU 用 ICC 可以优化执行性能,其他 CPU 的同学可以不必使用 ICC
            需要去 intel 的官网下载安装,个人和非商业使用只需注册一下,免费使用
            ——————————-设置开始——————————–

            ICC 一般是安装到 /opt 里面去的,系统并不能直接找到其可执行文件
            所以需要将其 bin 目录加到 PATH 环境变量里面去
            以我为例:
            在 /opt/intel/Compiler/11.1/056/bin/ 下面有两个文件一个目录(依系统位数
            的不同,目录的名字可能不一样): intel64/, iccvars.csh 和 iccvars.sh,你
            需要在 /etc/profile.d/ 下面建立一个脚本,比如 iccvars.sh 其内容如下:

            ——————————-不含此线——————————–
            #!/bin/bash
            source /opt/intel/Compiler/11.1/056/bin/iccvars.sh intel64
            ——————————-不含此线——————————–

            最后的那个参数 intel64 依你的系统不同而不同,应该和你在
            /opt/intel/Compiler/11.1/056/bin/ 中看的的目录名字相同,然后赋可执行权限:

            sudo chmod a+x /etc/profile.d/iccvars.sh

            注意,这样只会在重启后生效,若要当时生效,须执行一下:

          . /etc/profile.d/iccvars.sh 或 source /etc/profile.d/iccvars.sh

            此外,为了让程序(这里是 icc 等)找到它们所依赖的库,须得将 icc 的 lib
            路径加入到 /etc/ld.so.conf 里面
            以我为例:
            在 /etc/ld.so.conf 里面加上一行:

            ——————————-不含此线——————————–
            /opt/intel/Compiler/11.1/056/lib/
            ——————————-不含此线——————————–

            然后以 root 权限运行 ldconfig
            ICC 的设置到此结束
            ——————————-设置结束——————————–
    FORTRAN 编译器:
        IFORT:  Version 11.0
            这个也是 intel 的编译器,同样需要去其官方注册下载,个人版也是免费的
            当然你也可以使用 g95 等开源的 FORTRAN 编译器
            ——————————-设置开始——————————–

            IFORT 同样也是安装到 /opt 里面去的,所以也需要将其 bin 目录加到 PATH
            环境变量里面去
            以我为例:
            在 /opt/intel/Compiler/11.0/074/bin/ 下面有两个文件一个目录(依系统位数
            的不同,目录的名字可能不一样): intel64/, ifortvars.csh 和 ifortvars.sh
            你亦需要在 /etc/profile.d/ 下面建立一个脚本,比如 ifortvars.sh 其内容如下:

            ——————————-不含此线——————————–
            #!/bin/bash
            source /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64
            ——————————-不含此线——————————–

            最后的那个参数 intel64 依你的系统不同而不同,应该和你在
            /opt/intel/Compiler/11.0/074/bin/ 中看的的目录名字相同,然后赋可执行权限:

            sudo chmod a+x /etc/profile.d/ifortvars.sh

            注意,这样只会在重启后生效,若要当时生效,须执行一下:

          . /etc/profile.d/ifortvars.sh 或 source /etc/profile.d/ifortvars.sh

            此外,为了让程序(这里是 icc 等)找到它们所依赖的库,须得将 ifort 的 lib
            路径加入到 /etc/ld.so.conf 里面
            以我为例:
            在 /etc/ld.so.conf 里面加上一行:

            ——————————-不含此线——————————–
            /opt/intel/Compiler/11.0/074/lib/
            ——————————-不含此线——————————–

            然后以 root 权限运行 ldconfig
            IFORT 的设置到此结束
            ——————————-设置结束——————————–
    数学库:
        MKL: Version 10.2.3.029
            这个是 intel 的数学核心函数库,据说使用ifort编译器结合MKL数学库可以使
            代码执行速度大大提升。当然你如果不使用 MKL 的话会默认使用 BLAS 这个库
            AMD CPU 的同学可以考虑使用 ACML 这个数学库。同样,MKL 也可以到 intel 的
            官网上面申请免费版本
            ——————————-设置开始——————————–

            MKL 的设置相对简单,因为其只是一些库,没有可执行文件,所以只需要将 MKL
            库的位置加到 ld.so.conf 里面即可
            在 /etc/ld.so.conf 里面加上一行:

            ——————————-不含此线——————————–
            /opt/intel/mkl/10.2.3.029/lib/em64t/
            ——————————-不含此线——————————–

            然后以 root 权限运行 ldconfig
            IFORT 的设置到此结束
            ——————————-设置结束——————————–

三,具体操作过程
    在配置好了上面的编译环境以后便可以进行后续的编译过程了。
    首先,当然是准备 gamess 的源码咯,去 gamess 的网站上面填写申请,一般一到两天后会
    批下来,然后会邮件通知你下载地址,用户名和密码,然后就去拖下来咯,压缩包的大小约
    10M 左右,我下载的版本是: GAMESS version January 12, 2009 R3 for 64 bit
    (x86_64 compatible) under Linux with gnu compilers
    然后准备一个安装目录(我将其安放在 /home/gamess 里面),将压缩包解压到安装目录下面
    好了,可以看到几个可执行文件:
    compall, comp, lked, runall 和 rungms

    ———————————–修改脚本—————————————–
    我们接下来将编辑这几个文件以使其符合我们自己的实际情况
    以我为例:
    compall:
        line 16:  set TARGET=linux-ia64
        line 17:  set /home/gamess
        line 70:  if  ($TARGET == linux-ia64) set CCOMP=‘icc’ # 没有 icc 的可以继续 gcc
    comp:
        line 15:  set TARGET=linux-ia64
        line 16:  set /home/gamess
        line 109: if  ($TARGET == linux-ia64)   set BLAS3=/opt/intel/mkl/10.2.3.029/lib/em64t/
        # 如果你没有安装 MKL 的话就不要动上面这行
        # 由于我选择的 TARGET=linux-ia64,在 line 1507 可以看到已经是默认用了 ifort 作为 FORTRAN
        # 的编译器,如果你的 TARGET 是其他的而又想用 ifort 的话,可以去对应的地方 (即
        # if ($TARGET == xxx) then 下面将 FORTRAN 编译器改成 ifort)
    lked:
        line 18:  set TARGET=linux-ia64
        line 19: chdir /home/gamess
        line 498: if ($TARGET == linux-ia64) then # 若使用 MKL 则在下面添加一行
        line 499:     setenv MKLPATH /opt/intel/mkl/10.2.3.029/lib/em64t
        # 看它的脚本理论上来说不添加这行也是可以找到 MKL 的,不过在我这里报错说
        # 找不到 MKL 里面的某个 so,所以还是加上比较保险
    rungms:
        line 60:  set SCR=/home/gamess/scr/$USER
        # 存放运算临时文件的地方,自己喜欢放哪里放哪里,如果你内存够大的话也可以放在
        # /dev/shm (实际是个在内存里面的目录)
        将所有的 ~mike/gamess 换成你的 gamess 安装目录(我的是 /home/gamess)
        $USER/scr 替换成 $SCR
        你可以通过运行下面命令来一次性完成此工作:

        sed -i s|~mike/gamess|/home/gamess|g;s|~$USER/scr|$SCR|g ./rungms

        如果你想使用 SMP 方式并行多核运算的话如果是双核机器则修改这里:

        line 497: case br.msg.chem.iastate.edu: # 下面添加一行
        line 498: case YOUR-SERVER-NAME: # YOUR-SERVER-NAME 是运行 hostname 出来的结果
        line 499:   if ($NCPUS > 2) set NCPUS=2

        如果是四核机器则修改这里:

        line 490: case sc.msg.chem.iastate.edu: # 下面添加一行
        line 491:   case YOUR-SERVER-NAME: # YOUR-SERVER-NAME 是运行 hostname 出来的结果
        line 492:       if ($NCPUS > 4) set NCPUS=4
    runall:
        line 13:  chdir /home/gamess

    ———————————–编译 actvte—————————————
    下面我们要编译链接激活 gamess 代码的程序 actvte (下面命令均在终端下输入):

    cd /home/gamess/tools/
    # 视你 gamess 源文件存放地点的不同而 cd 到不同的目录
    cp actvte.code actvte.f
    sed -i s|^\*UNX|    |g actvte.f
    # 把以 *UNX 的开头用四个空格替换掉,即取消注释,亮出 UNIX-LIKE 系统的激活代码
    ifort -o actvte.x -Vaxlib actvte.f
    # 或 g95 -o actvte.x actvte.f 如果你没有 ifort 的话
    # 成功生成了 actvte.x 以后可以将 actvte.f 删除

    ———————————–开始编译—————————————–
    然后便可以开始编译了,在终端运行:

    cd /home/gamess
    ./compall
    # 如果你想看着它编译的话,或者让其在后台运行
    ./compall &> compall.log &
    # 上面两条命令选一即可,无须都执行
    # 经过一段取决于你机器性能的时间后(我这里大约用了 20 分钟)主要编译便完成了

    其后编译 gamess 的分布式数据接口 (DDI) 消息传递库,无论是否打算并行计算都必须
    编译,否则下面 lked 步骤通不过。假设现在主机名是 YOUR-SERVER-NAME(用 hostname
    命令可以看到当前主机名),就在 /etc/hosts 里面填上一行当前主机的IP地址和主机名
    例如: 192.168.153.3 YOUR-SERVER-NAME # [参考文献 1]
    命令:

    sudo su
    echo "192.168.153.3 YOUR-SERVER-NAME" >> /etc/hosts

    进入 /home/gamess/ddi 目录,修改 compddi
    
    compddi:
        line 18:  set TARGET = linux-ia64
        line 62:  set MAXCPUS  = 4
        line 63:  set MAXNODES = 2
        # set MAXCPUS 和 set MAXNODES 后面设成你的实际情况,前者代表每个节点中最多
        # 包含几个核心(每个节点内可以以SMP方式并行的核心数目),后者代表最多有几个
        # 节点,它们设的都可以比实际情况多 [参考文献 1]

    修改 /home/gamess/ddi/src/std_system.c

    std_system.c
        line 26:      struct hostent *hp; # 在其后插入一行
        line 27:      name = "YOUR-SERVER-NAME";
        # 之所以要加入这么一行是因为GAMESS的bug,会将主机名强行认作为localhost而不是
        # 实际主机名,导致运行时提示TCP error之类错误 [参考文献 1]

    最后运行命令:

    ./compddi
    mv ddikick.x ..

    最后编译图形应用程序

    cd /home/gamess/graphics
    编辑 complink 文件
    complink:
        line 15:  chdir /home/gamess/graphics
        line 18:  set TARGET=linux-pc
        line 31:  if ($TARGET == linux-pc)   set FORT=‘ifort -O2′

    之后运行./complink来编译

    ———————————–链接程序—————————————–
    链接可执行文件
    命令:

    cd /home/gamess
    ./lked gamess &> lked.log

    如果不出问题的话最终会在当前目录下生成一个 gamess.00.x 这样的可执行文件,至此我们的
    编辑工作就全部完成了,下面就是测试环节,在 /home/gamess 目录下运行 ./runall 将会对
    编译好的GAMESS程序进行测试,自动运行44个测试文件,将在当前目录下得到一批 exam??.log
    文件。修改 /home/gamess/tools/checktst 目录下的 checktst 文件:

    checktst:
        line 9:       set GMSPATH=/home/gamess
    
    然后运行此文件,出现提示时输入 /home/gamess,会将所得log文件的结果与标准结果相对比
    检查任务是否已正常结束,以及计算误差是否超过阈值。对于failed的任务,检查相应的log文件
    除掉毛病后,把 scr 目录下对应文件删掉,若要单独运行一个测试比如 exam42 可以使用命令:

    cd /home/gamess
    ./rungms exam42 00 4 &>exam42.log
    # rungms 的参数意义为: JOB=$1 (输入文件 xxx.inp,可以不输入扩展名); VERNO=$2 (lked
    # 一步的 revision 数字,默认 00); NCPUS=$3 (运行时调用的 CPU 核心数)

    待完成后再 checktst 看是否都已通过。

    一般情况下 exam42 和 exam43 会由于 linux 默认的单个共享内存段的最大值太小而不能通过
    使用 /sbin/sysctl -a | grep shmmax 命令察看默认值,这两个任务需要约 48MB,修改
    /etc/sysctl.conf,在里面加入一行 kernel.shmmax = 5000000000 将其增加到约 500MB
    可以使用命令 /sbin/sysctl -w kernel.shmmax=5000000000 来使其立即生效

参考文献:
    参考文献 1: http://hi.baidu.com/sobereva/blog/item/fff7b5fd1e8dd04fd6887db6.html
    参考文献 2: 王涛, 量子化学计算程序包GAMESS, 科学计算应用软件系列介绍

Chemistry ,

本文的评论功能被关闭了.