• Fedora7-64bit下編譯Gaussian03-C02

    PS:編譯gaussian03真是極為辛苦,以前弄到過一份G98的源碼,想盡辦法也仍然沒有完整編譯成功,差幾個link編不出來,網上也有關于編譯G98的討論,但是卻沒起什么幫助,似乎gaussian是出了名的難編譯,尤其是用的編譯器比較討厭,pgf的,編譯的腳本也寫得亂七八糟,莫名其妙,本以為編譯gaussian幾乎是無望的事,前一陣子有個好人發給我一個G03-C02的源碼,這兩天我又重新燃燒起來了,也不借助任何參考資料了(比如官網上就說運行bldg03就行,這話根本沒有任何價值),完全是摸石頭過河,反復編譯過不下30遍,經過不懈努力,歷經九九八十一難,終于修成正果。尤其是編譯util.so的經歷十分坎坷,本來一開始走的是歪門邪道,直接用官方發布的G03-C02的util.so,屏蔽掉對util.so的編譯,雖然可以正常編譯,但是總覺得不夠完美,一定要“從頭編”,或許可以說是ab initio compiling,于是又費盡周折,解決兼容性等問題。而且不光是能從頭編譯出來就算滿意,還仔細比較了不同方式編譯的性能,而且為了能夠總結出這篇讓所有人都能不遇到任何報錯的編譯方法,又反復驗證很多次。下面這些內容看起來不多,但價值極高。其實如果是在單核32bit平臺下編譯麻煩會少很多。


    Fedora7-64bit下編譯Gaussian03-C.02
    文/Sobereva @北京科音   寫于約2008年


    編譯平臺:root,fedora7-64bit,Intel Q6600。為保持兼容性這里編譯32bit版本。如果軟硬件嚴格符合這幾條要求,沒亂改過設置,對linux、gaussian和編譯器不是完全外行,保證95%可能性一遍編譯成功。

    http://www.pgroup.com下載pgf77 workstation,約290MB,我用的是8.01版。解壓運行install安裝到默認路徑,ACML和mpich1都不用裝。
    注冊一個新帳戶,郵箱只能用.edu等等的正經郵箱,如果難申請.edu的郵箱,可以到這里免費申請后綴是@hist.edu.cn的郵箱http://www.hsit.edu.cn。注冊后郵箱里會受到激活信,激活帳戶后,登陸,選Create trial keys,輸入/opt/pgi/license.info里面的FLEXnet hostid后面的內容,就可以得到license.dat,拷進/opt/pgi。注意每臺機子的id都不同,需要不同的license.dat,因此如果換了機子,就要重新在申請頁面填寫hostid以得到新的license.dat。這個license.dat可以使編譯器在兩周內運行。

    ln -s /opt/pgi/linux86/8.0-1/bin/pgf77 /usr/bin/pgf77 (編譯32bit版本用32bit版本編譯器)
    將g03源代碼的壓縮包解壓到/sob/g03

    修改/sob/g03/bsd/updatelink1的42行,將set-mflags改為/sob/g03/bsd/set-mflags
    修改/sob/g03/bsd/setup-make的28、68行,將set-mflags改為/sob/g03/bsd/set-mflags
    修改/sob/g03/bsd/g03.login的第74和第75行,將set-mflags改為/sob/g03/bsd/set-mflags,87行gau_machine改為./gau_machine
    修改/sob/g03/bsd/bldg03的第198、205、208、211行,將set-mflags改為/sob/g03/bsd/set-mflags。把120行改為set x = i386
    將/sob/g03/bsd/i386.make的580行(編譯cmpdst.o那段)的-c前面加上-m32,將599行(編譯mdutil.o那段)的-c前面加上-m32
    將/sob/g03/mdutil.c的第1267行(pthread_kill_other_threads_np()那行)刪掉。
    修改/sob/g03/set-mflags,將23行改為set csize=4096(此數值每個CPU不同,也就是cat /proc/cpuinfo里面顯示的cache size項),把第30行amd64改為aamd64(使之識別不能,這樣即便是64位平臺,也使用前面默認的編譯32bit版本的參數)
    拷貝/sob/g03內所有.inc文件至/usr/include
    /sob/g03>csh
    /sob/g03>setenv g03root /sob
    /sob/g03>chmod 777 *
    /sob/g03>chmod 777 ./bsd/*
    /sob/g03>source bsd/g03.login
    /sob/g03>bsd/bldg03 >& all.txt      (如果編譯失敗,在all.txt里面搜error找原因)
    將以下內容(星號內的)按順序加入/root/.bashrc:
    ******************
    export g03root=/sob
    source /sob/g03/bsd/g03.profile
    export GAUSS_SCRDIR=/sob/g03/scratch
    ******************
    /sob/g03>mkdir scratch
    /sob/g03>bash
    即可使用,經簡單測試編譯出來的和網上的已編譯好的G03-C02(IA32)運算結果一致,而且速度還快10%。

     

    編譯過程實際上是bldg03調用g03.make和updatelink1來完成。編譯前先編譯出gau-fsplit(bsd/fsplit.c)等工具,gau-fsplit將fortran源代碼文件拆成一個個子程序源文件,每個源文件只含一個函數,文件名就是函數的名字,分別編譯為.o再連接成完整文件。首先在temputil臨時目錄下編譯的util.a所需要的一堆.o,連接成util.a,再連接成util.so,之后就把這臨時目錄刪掉。然后依次編譯lxxx.exe,也是先編譯一大堆.o,暫存在temp-lxxx目錄然后組合,之后刪掉這個臨時文件夾。
    編譯一開始會刪掉bsd/g03.make,根據系統的架構不同,自動制作g03.make軟連接連接到???.make(比如i386.make),然后以g03.make控制文件的編譯過程。

    要想保留util.so的臨時文件夾temputil,把bldg03第342行也就是rm -f -r temputil注釋掉。
    想要保留每個子程序的臨時文件夾,把g03.make里面所有rm -f替換為#rm -f。這樣每個link子程序包含的內容比較清晰,方便查詢。

    如果想編譯某個子程序,比如l502.exe,運行make -f bsd/i386.make l502.exe。編譯所有.exe,即不編譯util.a,運行make -f bsd/i386.make exe。

    gau-machine的返回值就是當前CPU的架構,比如i386、amd64。即便是intel CPU,只要是64bit環境下,都顯示amd64。gau-machine是由bsd/machine.c編譯得到的,每次跑bldg03時都先編譯一編。

    bsd/set-mflags是用來設定編譯時的參數的腳本。在其中會調用gau-machine來確定編譯參數,以此決定用哪些參數和bsd下面哪個位數的.a庫,參數保存在$mflags,并把它傳遞給其它腳本。

    在64bit平臺下編譯32位版本還有另外一種辦法,就是修改/sob/g03/bsd/gau-machine.c的131行,將amd64改為i386。用這種方法就不必修改bldg03的第120行,也不必修改set-mflags里面的第30行。但是這樣編譯出來高斯比前面說的方法要慢1/5以上,比官方編譯好的更慢,但是更保險,如果前面的方法編譯出來的運行有問題則用這種修改machine.c的方法。

     

    上文編譯所需的xxx包下載地址,僅供學習交流之用:/usr/uploads/file/20150610/20150610212844_91729.zip

    久久精品国产99久久香蕉