先日、nVIDIA の GTX 1080 Ti を自作パソコンに入れました。
これからは GPGPU をフル活用していこうと思っており、これまで作ったプログラムを cuda 仕様に書き換えている今日この頃です。
さて、今年発売された Gaussian16 ですが、新しく追加された機能の一つとして GPU 対応したことが注目されています。公式 HP では Tesla K40, K80 をサポートしているが Pacal 世代の GPU は未対応である旨が書かれています。
Gaussian 16 can use NVIDIA K40 and K80 GPUs under Linux. Earlier GPUs do not have the computational capabilities or memory size to run the algorithms in Gaussian 16. Gaussian 16 does not yet support the Tesla-Pascal series.
公式にはサポートされていないものの、手元の GTX 10 シリーズで使えたりしないかなぁと思い、自作 PC で試してみることにしました。
管理人の環境
CPU: Intel CPU Core i7-7700 3.6GHz 8Mキャッシュ 4コア/8スレッド LGA1151
m/b: ASUS PRIME H270-PRO
メモリ(64 GB): Crucial DDR4 2400 MHz 16GB 4枚
グラフィックボード: GEFORCE GTX 1080 Ti 11GB
: GEFORCE GTX 1060 6GB
GTX 1080 Ti を導入後、lspci で確認すると
$ lspci | grep -i vga 01:00.0 VGA compatible controller: NVIDIA Corporation Device 1b06 (rev a1) 03:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)
と表示されてしまい、GTX 1080 Ti の名前が表示されないという寂しい思いをしました。その後 PCI ID をアップデートしました。
$ sudo update-pciids % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 228k 100 228k 0 0 185k 0 0:00:01 0:00:01 --:--:-- 185k Done.
現在は、しっかりと GeForce GTX 1080 Ti と表示されるようになりました。
$ lspci | grep -i vga 01:00.0 VGA compatible controller: NVIDIA Corporation GP102 [GeForce GTX 1080 Ti] (rev a1) 03:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)
GPU を使って計算する際の input ファイル
詳しくは、こちらのページに書かれていますが、%CPU と %GPUCPU というキーワードを指定することにより、Gaussian16 での GPU を用いた計算が可能となります。
以下にサンプルを置いておきます。
%mem=32000mb %cpu=0-7 %GPUCPU=0,1=0,1 %nosave %chk=compchem-GPGPU.chk #p B3LYP/6-31+G(d,p) int=(grid=ultrafine) scf=maxcyc=300 opt=(calcfc, maxcyc=300, tight) freq title 0 1 C -0.257594114431 -0.487952982307 1.418203534823 C -1.579988395059 -0.129416167457 1.683072481948 C -2.650713917978 -1.846337383530 -0.657001735807 C -2.328339586169 0.630831783157 0.793307140680 (以下略)
メモリについては、どれくらい確保すれば良いのか分からないので、かなり多めにとりました。
管理人の自作 PC は 4 コア 8 スレッドなので %cpu=1-8 と書いてしまいそうなところですが、CPU の番号のカウントは 0 からなので、%cpu=0-7 と書きます。(自分でプログラミングする人にとっては 0 から数え始めるのは普通のことですが、そうでない人にとってはわかりづらいかもしれません。)
%GPUCPU では GPU のデバイスとそれを制御する CPU を指定します。ここで指定する CPU の数が GPU の数よりも多い場合、エラーが起きて計算がスタートしませんでした。使用する GPU が 1 つだけの場合、%GPUCPU=0=0 のように書けば良いと思います。
Pascal 世代には対応していない
上述したような形式で input ファイルを作成すると、一応計算はスタートします。しかし、scf 計算の最初のサイクルで止まります。
この時、terminal には以下のエラーメッセージが表示されます。
Accelerator Fatal Error: No NVIDIA/CUDA version of this construct available for the current device File: /hopper/1/frisFailing in Thread:2 call to cuStreamCreate returned error 4: Deinitialized Error: segmentation violation
Amber や Gromacs は Pascal 世代に対応しているのに Gaussian はまだ対応していない。。。先日インストールした AutoDock GPU 版も CUDA 8.0 未対応でした。。。しかし、今更前世代の GPU に戻るわけにもいかず、新しい revision に期待するしかありません。
一方、log ファイルでは、最初に CPU と GPU の割り当てなどが記載されています。その後、scf 計算の途中で止まります。
(前略) %mem=32000mb %cpu=0-7 SetSPE: set environment variable "MP_BIND" = "yes" SetSPE: set environment variable "MP_BLIST" = "0,1,2,3,4,5,6,7" Will use up to 8 processors via shared memory. %GPUCPU=0,1=0,1 Will use 2 GPUs: Thread CPU GPU 0 0 0 1 1 1 2 2 -1 3 3 -1 4 4 -1 5 5 -1 6 6 -1 7 7 -1 %nosave %chk=compchem-GPGPU.chk Will use 2 GPUs: Thread CPU GPU 0 0 0 1 1 1 2 2 -1 3 3 -1 4 4 -1 5 5 -1 6 6 -1 7 7 -1 Properties for Device 0 Minimum vector length: 32 Maximum vector length: 1024 Number of SMPs: 28 Maximum number of threads per SMP: 2048 Number of ASync Engines: 2 Memory: 1410080768 Properties for Device 1 Minimum vector length: 32 Maximum vector length: 1024 Number of SMPs: 10 Maximum number of threads per SMP: 2048 Number of ASync Engines: 2 Memory: 785874944 707287449 words of memory will be used on each GPU. ---------------------------------------------------------------------- #p B3LYP/6-31+G(d,p) int=(grid=ultrafine) scf=maxcyc=300 opt=(calcfc, maxcyc=300, tight) freq ---------------------------------------------------------------------- (中略) Cycle 1 Pass 1 IDiag 1: FoFJK: IHMeth= 1 ICntrl= 0 DoSepK=F KAlg= 0 I1Cent= 0 FoldK=F IRaf= 990000000 NMat= 1 IRICut= 1 DoRegI=T DoRafI=F ISym2E= 0 IDoP0=0 IntGTp=1. FoFCou: FMM=T IPFlag= 0 FMFlag= 100000 FMFlg1= 2001 NFxFlg= 0 DoJE=F BraDBF=F KetDBF=F FulRan=T wScrn= 0.000000 ICntrl= 0 IOpCl= 0 I1Cent= 0 NGrid= 0 NMat0= 1 NMatS0= 1 NMatT0= 0 NMatD0= 1 NMtDS0= 0 NMtDT0= 0 Symmetry not used in FoFCou. FMM levels: 10 Number of levels for PrismC: 9 ここで突然止まる
公式ページには Tesla に関しての記載しかありませんが、GTX 9 シリーズで Gaussian16 が動くか非常に興味があります。
【追記 2018.03.01】
Gaussian 16 Rev. B.01 では Pascal 世代の GPU に対応したようです。
管理人は専門の研究者ではありませんので、もしも記事内容に間違い等を発見した際は、コメント欄またはメールにて教えてくだされば幸いです。
参考文献
関連する記事
- 計算化学での非共有結合相互作用 (NCI)
- GPU を用いた並列計算
- 最新版 Gaussian 16 登場!
- 自作 PC をつくってみた!
- Fedora25 に nVIDIA のドライバーをインストール
- 自作 PC を作ってみた!【OS 編】
- GRRM の振動計算の結果を Gauss View で解析する方法
- SCFの収束について
- 構造最適化の閾値は、何を意味しているのか?
- 量子化学計算で a.u. を使う理由 〜Why Atomic Unit?〜