• GAMESS-US 2009 R3版編譯方法

    GAMESS-US 2009 R3版編譯方法

    文/Sobereva @北京科音   
    First release: 2009-Oct-7  Last updated: 2010-Jan-20


    操作系統:Fedora7-64bit,已裝gcc 4.1.2(在系統安裝過程中選擇了安裝軟件開發這一類就會裝上),系統中有csh(Fedora8及以后需手動安裝csh),root用戶,使用bash shell,GAMESS(US)版本為January 12, 2009 R3,CPU為Intel Core2 Q6600,2G內存。

    對于Intel CPU,相較使用GNU的編譯器和其它數學庫,使用ifort編譯器結合MKL數學庫可以使代碼執行速度大大提升,所以這里用ifort+MKL方案。GAMESS也有少部分C語言的代碼,主要是用在DDI(Distributed Data Interface)部分,而非計算密集的部分,對性能影響不大,故使用gcc足矣。

    去intel網站下載intel fortran compiler for linux(以下簡稱ifort),本文用的是10.1.015版,安裝到默認文件夾opt/intel/fce/10.1.015。
    (如果安裝時提示缺少libstdc++.so.5,將libstdc++-5.0.7-86.x86_64.rpm在圖形界面下雙擊安裝進系統)
    下載Intel Math Kernel Library(以下簡稱MKL),本文用的是10.0.4.023版,安裝到默認文件夾/opt/intel/mkl/10.0.4.023。
    在/root/.bashrc中添加:
    source /opt/intel/fce/10.1.015/bin/ifortvars.sh
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/intel/mkl/10.0.4.023/lib/em64t
    輸入bash,使環境變量生效。

    在http://www.msg.chem.iastate.edu/GAMESS/download/register/頁面中提交你要下載的文件的申請(即用于64 bit IA64/x86_64 under Linux with Intel compilers的GAMESS源碼),提交后過一兩天電子郵箱內會收到確認信,里面提供了下載頁面和下載所需的用戶名和密碼。
    將下載到的gamess-current.tar.gz解壓至/sob/gamess,最終可執行文件也將編譯到這里。
    建議閱讀一下misc文件夾下的readme.unix,介紹了編譯方法和參數意義。

    修改gamess目錄下的compall、comp、lked、runall文件的開頭部分,TARGET=后面都改為linux-ia64(runall沒有TARGET字段,此處不用改),chdir后面都改為/sob/gamess。rungms里面的SCR=后面改為/sob/gamess/scr,setenv ERICFMT和setenv MCPPATH后面的~mike都改為/sob,if ($os == Linux)一行的GMSPATH=后面改為/sob/gamess,~$USER全都替換為/sob/gamess。(注意gamess中的linux-ia64不僅僅指Itanium的IA64架構,也包括EM64T架構。此時默認,也只能使用ifort編譯器和MKL數學庫。)

    把/sob/gamess/tools/actvte.code復制為actvte.f,并把actvte.f中所有*UNX用四個空格替換。然后編譯此文件ifort -o actvte.x -Vaxlib actvte.f。由于GAMESS對于不同架構的計算機都使用同一套源代碼,在下面comp腳本編譯源文件過程中,這個程序用來自動將源代碼(.SRC文件)中的一些內容替換以迎合當前環境,成為.FOR文件,稱為“激活”過程,FOR文件被編譯為.o后會被自動刪掉。

    在/sob/gamess目錄下運行./compall,它會自動調用comp腳本來編譯各個源文件成為.o并放到object目錄中。編譯約半個小時,最終會得到230多個.o文件。

    現在編譯GAMESS的分布式數據接口(DDI)消息傳遞庫,無論是否打算并行計算都必須編譯,否則下面lked步驟通不過。假設現在主機名是f71(用hostname命令可以看到當前主機名),就在/etc/hosts里面填上一行當前主機的IP地址和主機名,例如192.168.153.3 f71,重啟。進入/sob/gamess/ddi目錄,修改compddi文件開頭的set TARGET =后面為linux-ia64,把set MAXCPUS和set MAXNODES后面設成你的實際情況,前者代表每個節點中最多包含幾個核心(每個節點內可以以SMP方式并行的核心數目),后者代表最多有幾個節點,它們設的都可以比實際情況多。本文都設成2。在/sob/gamess/ddi/src/std_system.c里面的struct hostent *hp;后面加入一行name="f71";(f71是主機名,之所以要加入這么一行是因為GAMESS的bug,會將主機名強行認作為localhost而不是實際主機名,導致運行時提示TCP error之類錯誤。如果不添加也沒有出現這個錯誤則無需添加這行)。最后運行./compddi >& compddi.log,很快就編譯完成了。把得到的ddikick.x移動到上一級目錄即/sob/gamess下。

    在/sob/gamess目錄下運行./lked gamess 03 >& lked.log,目的是將編譯好的.o文件、DDI庫文件和數學庫連接到一起成為可執行文件,很快就得到了最終可執行文件gamess.03.x。編譯參數中的03是隨意取的,也可以是00、01等等,目的只是區分不同GAMESS版本可執行程序,作為一個標識。(如果只運行./lked gamess >& lked.log,則默認生成gamess.00.x)

    因為可執行文件名用了03標識,故將runall里面的set VERNO=后面默認的00改為03。
    建立/sob/gamess/scr文件夾作為GAMESS運行的臨時文件夾。
    在/sob/gamess目錄下運行./runall來對編譯好的GAMESS程序進行測試,自動運行44個測試文件,將在當前目錄下得到一批exam??.log文件。修改tools/checktst目錄下checktst文件的set GMSPATH=為/sob/gamess,然后運行此文件,出現提示時輸入/sob/gamess,會將所得log文件的結果與標準結果相對比,檢查任務是否已正常結束,以及計算誤差是否超過閾值。對于failed的任務,檢查相應的log文件。除掉毛病后,把scr目錄下文件都刪掉,再運行runall和checktst看是否都已通過。

    筆者在測試中exam36和43通不過,打開相應log文件發現如下提示:Check system limits on the size of SysV shared memory segments。這是因為linux默認的單個共享內存段的最大值太小造成的,使用/sbin/sysctl -a|grep shmmax命令察看默認只設了32MB,而這兩個任務需要約48MB。遂修改/etc/sysctl.conf,在里面加入一行kernel.shmmax = 1610612736,這就將上限提高到了1.5G,之后重啟(也可以運行/sbin/sysctl -w kernel.shmmax=1610612736來立刻生效而無需重啟)。重新runall并運行checktst,發現任務均已Passed。

    如果想用SMP方式并行雙核運行,在rungms的if ($NCPUS > 2) set NCPUS=2那行的上面插入一行case f71:(如果是四核機子,就在if ($NCPUS > 4) set NCPUS=4前面插入這行)。之后比如運行./rungms exam01.inp 03 2 &> a.txt就說明用單節點雙核調用gamess.03.x執行exam01.inp任務。若只輸入./rungms exam01.inp則說明用單核心調用gamess.00.x執行exam01.inp任務。

    最后編譯圖形應用程序,進入graphics目錄,將complink文件里面的chdir后面改為/sob/gamess/graphics,set TARGET=后面改為linux-pc,if ($TARGET == linux-pc)   set FORT=后面改為'ifort -O2',之后運行./complink來編譯。


    附注:
    完整地編譯成功后,如果修改了src目錄下某個源代碼文件,比如是int2a.src,想重新編譯可執行文件使改動生效,只需要在/sob/gamess目錄下運行./comp int2a,然后刪掉原GAMESS可執行文件,重新lked即可。不必用compall把所有文件再編譯一遍。

    在32bit系統+任意CPU(不限intel)+gfortran下的編譯方法:
    步驟與上述一致,只要把上文相應部分替換為下述即可。
    數學庫不用額外安裝,會自動編譯并連接GAMESS自帶的blas庫,但缺點是慢。
    上述提到的改為linux-ia64的地方都改為linux32
    ifort -o actvte.x -Vaxlib actvte.f改為gfortran -o actvte.x actvte.f
    lked的302行,即if ($TARGET == linux32) then下面,把set FORTRAN=后面改為gfortran。
    comp的1138行,把set FORTRAN=后面改為gfortran。
    ddi目錄下compddi的540行,即if ($TARGET == linux32) then下面,把set FORTRAN=后面改為gfortran。
    graphics目錄下complink的if ($TARGET == linux-pc)   set FORT=后面改為'gfortran -O2'

    在64bit系統+任意CPU(不限intel)+gfortran下的編譯方法
    與上面32bit下安裝一致,把其中linux32都改成linux64即可。lked、comp和compddi里對linux64模式默認就是用gfortran,不必再手動改了。但需要把lked中的#  Using blas.o will give a successful link, to slow matrix multiply routines.這一行下面的exit 4刪掉,否則若沒裝MKL或Atlas或ACML庫會報錯,而這樣改后就會用自帶的blas庫代替。
    久久精品国产99久久香蕉