GROMACS的原生Windows版的編譯和安裝方法(支持GPU加速)
GROMACS的原生Windows版的編譯和安裝方法(支持GPU加速)
文/Sobereva@北京科音
First release: 2019-Jun-4 Last update: 2021-Jul-10
注1:本文拿2019.1版作為例子進行說明編譯過程。本文的純CPU版的編譯方法經測試對于GROMACS 2018、2019各版本都適用,其它版本只要不是太老的應當都可以用,但未經實際測試。本文的編譯CUDA GPU加速版的方法經測試對GROMACS 2019.1及之后的2019.x版、2020.x版都適用,不適用于2019.1之前的版本。本文的編譯方法對于未來的GROMACS版本以及其它Visual Studio版本是否適用筆者不保證,請自行嘗試,如果發現不行,請舉一反三試圖解決。
注2:如果大家對編譯過程不感興趣,只想立刻直接用筆者編譯好的Windows版的GROMACS,請直接看本文第5節,里面有下載地址和安裝方法。
1 前言:關于在Windows下使用GROMACS
GROMACS一般都是在Linux下運行,其Linux下的安裝方法我在《GROMACS的安裝方法》(http://www.shanxitv.org/457)中已經詳細交代了,還特意錄了視頻演示編譯過程。在Windows下使用GROMACS有多種方式:
? 使用VMware裝Linux虛擬機,并照常以Linux方式編譯。裝Linux虛擬機十分簡單,過程見《在VMware 15中安裝CentOS 7.6的完整過程視頻演示》(http://www.shanxitv.org/454)。Linux下的所有程序都可以以這種方式使用,而且直接有圖形環境。但局限性是VMware客戶機支持的CPU核數有限,比如VMware 16最多支持32個核。總的來說筆者極度青睞VMware。
? 在Cygwin下編譯。Cygwin提供了類似Linux系統的命令行環境,也提供了程序包管理器和源,相對于使用VMware更輕量級,而且編譯出的程序只要提供一些Cygwin的dll文件就可以直接挪到其它Windows機子下用。對于大多數程序Cygwin下編譯方式和Linux下一樣(gcc、make、cmake等都有),但也有很多情況需要額外折騰,有時編譯過程特別遲鈍,而且有時候有一些特殊情況,比如筆者在Cygwin下編譯GROMACS時必須要求不利用AVX指令集,否則編譯會失敗。
? Win10的Linux子系統(WSL)。筆者個人不怎么喜歡這東西,用著別扭,這里不多提,和Cygwin在形式上有很大相似之處,鑒于是Windows自帶的,以后必然會吞掉Cygwin很大的生存空間。
以上三種方法在原理上都會使得計算性能打一些折扣,但一般也就10~15%左右,這不是重點,共同的嚴重缺點是不能支持GPU加速(WSL2倒是號稱支持,不過我沒試過)。在Windows下最完美的運行GROMACS的方法莫過于直接編譯原生的Windows版GROMACS,編譯出的程序可以拿到任何其它Windows機子上直接用,不需要裝額外運行環境,不會像上述三種方法那樣會對CPU性能打折扣,而且還能像Linux下一樣在跑GROMACS的時候使用GPU加速。
本文目的是詳細介紹一下怎么編譯原生的Windows版GROMACS,其實過程一點也不復雜(網上有些教別人編譯Windows版GROMACS的文章寫得很不好,過程十分繁瑣,寫得不明不白,而且對較新版本還不適用)。
首先提一下,GROMACS需要利用FFT(快速傅立葉變換)庫,有三種選擇
(1)FFTW庫:這是最佳選擇,一般都用這個,效率高。在Linux下編譯GROMACS可以自動下載FFTW庫并安裝,但是在Windows下沒法實現這點
(2)MKL庫:效率和FFTW差不多,需要額外安裝,較麻煩,而且占不少硬盤
(3)fftpack庫:這是GROMACS自帶的,圖省事用這個就行了,但是經實測效率比基于FFTW庫低百分之十幾
下面按照編譯過程由簡到繁,分為三部分依次說:
(1)編譯基于fftpack的純CPU版
(2)編譯基于fftw的純CPU版
(3)編譯基于fftw且支持CUDA加速的版本
本文只涉及編譯最常用的單精度版、只能單節點并行的情況。本文編譯的都是64bit版本。
2 編譯基于fftpack的純CPU版
如果你對計算效率沒什么要求,只需要以盡量簡單的方式編譯出一個能在Windows下跑的GROMACS,那么只看這一節就夠了。下面我們來編譯基于fftpack庫的GROMACS。
首先安裝Visual Studio,這里用的是Visual Studio 2019。Visual Studio最低級的是community(社區)版,是完全免費的。大家在https://visualstudio.microsoft.com/zh-hans/downloads/就可以下載到最新版。下載到的是一個非常小的安裝器,啟動它就可以在線安裝(目前的Visual Studio是沒有鏡像文件的。雖然也有辦法把其組件全部下載后再離線安裝,但是會占幾十GB硬盤,因此不要考慮離線方式安裝)。雖然看起來在線安裝好像很耗時,但其實以現在的網速來說總耗時也不算很高。安裝Visual Studio的時候應選擇“使用C++的桌面開發”,確認“安裝詳細信息”中“用于CMake的Visual C++工具”是已選中的狀態。
將gromacs-2019.1.tar.gz源代碼包解壓到比如C:\gromacs-2019.1。
在開始菜單里選Visual Studio 2019 - Visual Studio Tools - Developer PowerShell for VS 2019,由此進入編譯環境都配置好的命令行窗口。然后依次輸入
cd C:\gromacs-2019.1
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=C:/gmx2019.1 -DGMX_FFT_LIBRARY=fftpack -G "Visual Studio 16 2019"
cmake --build . --target INSTALL --config Release
耐心地等待編譯好后,會看到出現了C:\gmx2019.1目錄,里面就是編譯好的可執行文件以及相關文件了,內容和Linux版一樣。按照本文第5節的做法將C:\gmx2019.1\bin添加到Path環境變量后,程序就可以用了,用法和Linux版沒有任何區別。
當前機子的CPU最高支持什么指令集,默認情況下編譯出的GROMACS就是基于什么指令集的。如果比如你的機子的CPU支持AVX2指令集,那么編譯出的GROMACS拿到只支持到AVX指令集的CPU上就沒法跑,比如mdrun運行時會崩潰。
有幾點值得額外說明,有興趣可以了解一下:
cmake的-G選項代表設置Generator,相當于指定編譯環境,可以運行cmake -G查看有哪些Generator可選。"Visual Studio 15 2017 Win64"代表產生出對應于VS2017的64bit平臺的解決方案,之后進而編譯出的程序就是適合Windows 64bit的版本了。
Visual Studio自帶了cmake(因為我們安裝VS時選上了),實際上也可以直接去cmake官網上下載獨立的cmake程序,里面還帶有cmake-gui.exe,提供了cmake的圖形界面。網上某些編譯Windows版GROMACS的文章用了這個東西,實際上完全多此一舉,直接按照上面的做法用命令行輸入省事得多。
如果讀者打開build目錄下的Gromacs.sln解決方案文件,會看到里面有很多不同的工程,其中名為ALL_BUILD的工程對應于編譯出最終的可執行文件,而INSTALL的工程對應于不僅編譯可執行文件(因為其引用了ALL_BUILD),還將程序安裝到CMAKE_INSTALL_PREFIX設的目錄,因此上文的語句里用了--target INSTALL。
上面的--config后面跟的是編譯時用的配置。名為Release的配置是適合用于發布的,會對代碼充分進行優化。
在cmake --build ...的那一步后面再接上比如-j 4代表使用4核并行編譯,但是實測發現對編譯耗時沒有可查覺的影響,和Linux下的情況完全不同。
3 編譯基于fftw的純CPU版
先在此下載FFTW 3.3.8庫:http://www.fftw.org/fftw-3.3.8.tar.gz。將之隨便解壓到某個地方,然后開啟Developer PowerShell for VS 2019,進入FFTW庫解壓的目錄(此目錄下會看到CMakeLists.txt),運行以下命令
cmake . -DCMAKE_INSTALL_PREFIX=C:\fftw338 -DENABLE_SSE2=ON -DENABLE_AVX=ON -DENABLE_FLOAT=ON -DBUILD_SHARED_LIBS=ON -G "Visual Studio 16 2019"
cmake --build . --target INSTALL --config Release
這樣,FFTW庫就被裝到C:\fftw338目錄下了,里面有庫文件、頭文件等。如果你的CPU支持AVX2指令集,建議把上面命令里-DENABLE_AVX=ON改為-DENABLE_AVX2=ON以獲得更好的性能。
接下來的編譯過程類似上一節,區別是指定的FFT庫不同:
cd C:\gromacs-2019.1
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=C:/gmx2019.1 -DGMX_FFT_LIBRARY=fftw3 -DCMAKE_PREFIX_PATH=C:/fftw338 -G "Visual Studio 16 2019"
cmake --build . --target INSTALL --config Release
編譯完成后,手動將C:\fftw338\bin里的fftw3f.dll拷到C:\gmx2019.1\bin目錄下,之后將這個目錄加入Path環境變量后就可以用了。
4 編譯基于fftw且支持CUDA加速的版本
去https://developer.nvidia.com/cuda-toolkit下載CUDA toolkit,里面提供了編譯CUDA加速程序所需要的庫、頭文件、編譯器等等。為了節約硬盤空間,裝CUDA toolkit時只需要選擇安裝CUDA分類里的Development、Runtime和Visual Studio Integration即可。這里假定裝到了自定義的D:\CUDA_toolkit目錄下。值得一提的是,編譯CUDA版GROMACS的機子并不需要非得有可以實現CUDA加速的GPU,只要裝了CUDA toolkit,在什么機子上都可以編譯。
按照上一節的做法把FFTW庫編譯好,然后輸入
cd C:\gromacs-2019.1
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=C:/gmx2019.1_GPU -DGMX_FFT_LIBRARY=fftw3 -DCMAKE_PREFIX_PATH=C:/fftw338 -G "Visual Studio 16 2019" -DGMX_GPU=ON -DCUDA_TOOLKIT_ROOT_DIR=D:/CUDA_toolkit
cmake --build . --target INSTALL --config Release
然后和上一節一樣把fftw3f.dll拷到新產生的C:\gmx2019.1_GPU\bin目錄下,之后將這個目錄加入Path環境變量后就可以用了。
如果你編譯出的GROMACS要拿到其它沒有裝CUDA toolkit的機子上用,或者那臺機子裝的CUDA toolkit是老版本,那么你應當先把D:\CUDA_toolkit\bin\cufft64_10.dll(_后面的數字視CUDA toolkit版本而定)也拷到C:\gmx2019.1_GPU\bin目錄下,然后再把這個gmx2019.1_GPU目錄拷到其它機子上用。
如果當前機子里有支持CUDA加速的GPU,而且GPU驅動的版本號足夠新,滿足當前CUDA toolkit版本的要求,那么運行CUDA版GROMACS的時候就會自動識別出兼容的GPU,并提示利用GPU進行運算。如果你的GPU不滿足要求或者驅動版本太老,那么CUDA版GROMACS也能運行,只不過是純粹用CPU來跑。在https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html頁面里可以查到各個CUDA toolkit所需要的GPU驅動最低版本號,如果你的GPU能裝上滿足要求版本的驅動(較新版本的驅動不支持很老的GPU),那么你的GPU就能加速GROMACS運算。
PS:對于用GPU加速的情況,用fftpack還是fftw對計算耗時影響很小,圖省事的話基于fftpack編譯GPU版也可以。
5 筆者預編譯的原生Windows版的安裝方法
這里提供筆者編譯好的GROMACS Windows 64bit版,在Win7、Win10下經測試都可以用,都可以單機并行,FFT庫都是用的FFTW。
2018.8 CPU版,AVX指令集(15 MB):http://www.shanxitv.org/soft/gmx/gmx2018.8_AVX_win64.rar
2019.6 CUDA GPU加速版,AVX指令集(93 MB):http://www.shanxitv.org/soft/gmx/gmx2019.6_AVX_CUDA_win64.rar
2020.3 CUDA GPU加速版,AVX指令集(93 MB):http://www.shanxitv.org/soft/gmx/gmx2020.3_AVX_CUDA_win64.rar
2020.6 CUDA GPU加速版,AVX2指令集(88 MB):http://www.shanxitv.org/soft/gmx/gmx2020.6_AVX2_CUDA_win64.rar(nVidia顯卡驅動需>=471.11版)
使用前必須先設置環境變量,將程序的bin目錄加入到Path環境變量里。對于Win7來說,過程是:假設預編譯版GROMACS壓縮包解壓到了C:\gmx2019.6,應當進入“控制面板”-“系統”,選擇“高級系統設置”,在“高級”標簽頁里選擇“環境變量”,在“xxx的用戶變量”下面選擇Path變量,點擊“編輯”,在“變量值”文本框最后加上一個分號,然后再寫上GROMACS目錄的bin子目錄的路徑,比如;C:\gmx2019.6\bin\。之后進入Windows的命令行窗口,輸入gmx命令的時候就應該出現相關提示信息了,此時就可以像Linux版一樣照常使用了。
注:如果你的計算機水平十分糟糕,甚至差到難以按照上面的說明正確設置環境變量,一定要參考演示視頻:https://www.bilibili.com/video/av39914815/。
如果你的機子里沒有裝Visual Studio,或者裝了但是版本比2019老,應先去https://aka.ms/vs/16/release/VC_redist.x64.exe下載并安裝Visual C++ Redistributable,這提供了必備的運行環境,否則啟動時會提示缺少dll。
對于上面提供的CUDA GPU加速版,使用者并不需要在機子里安裝CUDA toolkit,只要確保nVidia顯卡驅動足夠新就可以直接使用。如果你的驅動太老導致無法使用,應當先去nVidia官網https://www.nvidia.com/Download/index.aspx下載最新版本驅動并安裝。
不要問我怎么雙擊gmx.exe之后程序閃退(老有人問),因為GROMACS根本就不是靠雙擊圖標來使用的!GROMACS是通過命令行使用的程序,稍微有點最基本GROMACS常識的人都知道不應該雙擊gmx.exe圖標來使用。如果想從0開始系統性學習GROMACS,強烈建議參加北京科音分子動力學與GROMACS培訓班,一次性徹底學明白,詳見:http://www.keinsci.com/workshop/KGMX_content.html。
經筆者在2*E5 2696v3(36核)機子上對一個三萬多原子的蛋白質+水盒子的測試發現,Windows下純CPU版的計算速度只有按照《GROMACS的安裝方法》(http://www.shanxitv.org/457)方法編譯出來的Linux版的60%,估計是微軟的編譯器沒有gcc那么給力所致。GPU版我沒有對比測試,但應該速度相差不會這么顯著。所以,如果你只用CPU來跑計算,建議還是用Linux系統。