gaussian 16 Rev. A.03 は pascal 世代の GPU に未対応?

先日、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 に対応したようです。

参考Gaussian 16 Rev. B.01 リリース

 

管理人は専門の研究者ではありませんので、もしも記事内容に間違い等を発見した際は、コメント欄またはメールにて教えてくだされば幸いです。

参考文献

  1. GPUの使用

関連する記事

汎関数一覧に戻る

計算手法に戻る

コメントを残す(投稿者名のみ必須)