在Gaussian 16計算中使用GPU
本文介紹如何在G16中使用GPU來加速計算。本文內容是筆者閱讀了Gaussian官網關於使用GPU的說明後,按自己的理解寫下的,所以有些地方不能保證十分的嚴謹或正確,只能說是一種參考。官網網頁或其他更為詳細的參考資料請參見文末。
筆者測試時使用的Gaussian是G16 A.03版本,硬體方面CPU為單路八核8線程,GPU為兩塊Tesla K80,每塊顯卡內存(顯存)均為12GB,操作系統是CentOS 6.5。首先要強調的是G16的HF和DFT相比於G09是優化過的,即使不用GPU,純CPU計算也是G09的1.5倍左右(計算精度相同下),用GPU不過是錦上添花。
Step 1:獲得CPU編號
執行命令行top,之後按1,可以看到Cpu0-Cpu7(示例見下圖),共8個線程。這裡的0-7是接下來會用到的CPU編號。
Step2:獲得GPU編號
執行命令行nvidia-smi,可以顯示出有幾塊顯卡,如果你的機器上除了計算顯卡Tesla之外還裝有專業繪圖顯卡Quadro的話,這裡也可以看到(示例見下圖)。顯卡名稱下方還顯示有溫度,右側還可以看到顯存(此處截圖無)。
這裡的0,1是接下來將會用到的GPU編號。上圖中的PID是運行GPU計算任務後可以顯示當前有幾個計算任務,PID分別是多少。上圖中顯示此時無GPU進程。
Step3:寫gjf文件
%chk=a.chk
%mem=12GB
%cpu=0-7
%gpucpu=0,1=0,4
#p B3LYP/6-31G(d)int=(fine,acc2e=10)
…
主要區別在於原來的%nprocshared拆分為2行,其中第一行寫要用的CPU編號,這裡的%cpu=0-7等價於之前的%nprocshared=8,只不過這裡用具體的ID號來表示;如果你的機器有16線程,那可以寫%cpu=0-15。另外還支持直接指定,如%cpu=0-1, 6-7等等,這樣你可以在2-5上交另一個計算任務。
其中第二行%gpucpu=0,1=0,4,顧名思義,第一個等號後寫要用的GPU編號,第二個等號後寫control cpu的編號,表示讓Cpu0控制GPU0,Cpu4控制GPU1,高斯要求每個GPU必須分配其一個controlcpu,彷彿控制、協調其工作一樣。同時,這裡的control cpu編號必須被包含在上一行的%cpu編號里,比如0,4屬於上一行的0-7之中。但是這會帶來另一方面的缺憾,高斯官網說control cpu只用於控制,不用於做計算,也就是說0-7之中只有6個線程在做計算(當然GPU也在做計算),和4隻用於控制。這意味著什麼?假設單個GPU的計算速度是單個CPU的5倍,
方案1:全部用8線程做計算,不用GPU;
方案2:用6線程計算,2線程用來控制2塊GPU,相當於6 + 2*5 = 16;
16/8= 2.也就是說,用2塊GPU最多2倍的加速而已。筆者測試時,用與不用GPU的G16相對比,也沒有超過2倍加速。說明G16 A.03的GPU加速還是一個比較原始的版本,期待後續的改進。當然,如果你用GPU的G16與只能用CPU的G09相比,那就是高鐵與長途汽車的差別了。
關於內存的指定,一般做中小體系的DFT計算時不必刻意在乎這個問題。需要大內存時,換算規則是這樣的:一塊12GB顯存的GPU,CPU內存需要約8 GB,如果用6個線程跑,需要指定%mem=48GB。詳細可以參看文末的參考資料。
注意事項1:
建議一開始先進行一些簡單例子的測試,熟悉該過程。
注意事項2:
再次提醒,G09與G16對於DFT的積分格點默認精度是不一樣的,G09默認的是fine,G16默認的是ultrafine;電子積分精度也是不一樣的,G09默認acc2e=10,而G16則是12。因此若要進行嚴格對照或者重複,要使用相同的精度。
注意事項3:
有的GPU機器上除了Tesla之外,還裝了Quadro,並且Quadro與某個Tesla GPU有關聯,這時候在gjf文件內即使寫對了Tesla的GPU編號可能也會報錯,可以嘗試換成Quadro的編號。當然,計算時通過nvidia-smi命令可以看到實際上還是Tesla在做計算。這個問題的深層原因筆者並不清楚,可能需要一些硬體架構的知識。
參考資料:
1.高斯官方關於GPU使用的說明http://gaussian.com/running/?tabid=5
網頁上的GPU/CPU硬體排列關係圖,可以用命令nvidia-smi topo –m看到。
2.GPU/CPU硬體排列關係的解釋
http://blog.exxactcorp.com/exploring-the-complexities-of-pcie-connectivity-and-peer-to-peer-communication/
TAG:量子化學 |