GPUによる量子化学シミュレーション 2

密度汎関数計算には多数の複雑なステップがあるが、最も良く使われる500〜1000基底関数で計算時間を食う部分は、(1) 近距離Coulombポテンシャルの計算(40%)、(2) 交換相関ポテンシャルの計算(40%)、(2) Fock行列対角化(10%)なので、この部分のみ加速すれば良い。

この内streaming processorが苦手なのは(1)である。ここではGauss関数間の電子間反発積分を計算する。漸化公式を使い短縮Gauss関数を同時処理する方法が、理論計算量が最小で、汎用CPUでは最も高速である。この方法では1個の電子間反発積分を計算するのに、数千語の作業領域が必要だが、streaming processorには数十語の作業領域しかない。いろいろ検討した結果、direct J法で静電ポテンシャルを計算する時に限り、primitive Hermite Gauss 関数を使っても計算速度は下がらず、かつ作業領域も何とかなりそうだと分かった。

密度汎関数理論の方程式。静電、交換相関、HF交換ポテンシャルの計算に時間がかかる。

密度汎関数計算には多数の複雑なステップがあるが、最も良く使われる500〜1000基底関数で計算時間を食う部分は、(1) 近距離静電ポテンシャルの計算(40%)、(2) 交換相関ポテンシャルの計算(40%)、(2) Fock行列対角化(10%)なので、これらをまず加速する。

この内streaming processorが苦手なのは(1)である。ここではGauss関数間の電子間反発積分を計算する。漸化公式を使い短縮Gauss関数を同時処理する方法が、理論計算量が最小で、汎用CPUでは最も高速である。この方法では1組の電子間反発積分を計算するのに、数千語の作業領域が必要だが、streaming processorには数十語の作業領域しかない。検討した結果、Hermite Gauss基底で静電ポテンシャルを計算すれば、計算量が数割増えるだけで、作業領域も100語程度になりそうだと分かった。

2つめの問題は計算精度である。量子化学計算のは倍精度計算が必要だと言われていたが、描画装置であるGPUは、単精度計算しか速くない。そこで、大型分子で計算される電子間反発積分を調べると、ごく少数で大きな値の積分が、誤差の大部分を作る事が分かった。現在の積分計算アルゴリズムでは、Schwarz不等式を用いて積分上限値を求め、十分小さい値は計算しない。そこで単精度計算での誤差が無視できる項のみGPUで計算し、残りはCPUで計算した。9割の積分を単精度で計算しても、精度に問題が生じない事が分かった。積分計算の各ステップで必要精度も調べた。

3つめの問題はCPU-グラフィックボード間の通信の遅さである。平均すると 数十演算で 1積分が計算されるため、これらをグラフィックボードから回収するには通信が遅すぎる。そこで静電ポテンシャル行列に足し合わせて回収した。これは古典2体力計算を加速するGRAPEシリーズと同じアイデアである。また実装上の問題として、十分な細粒度並列性を確保するため、ホストプログラムを相当修正する必要があった。またNVIDIAのコンパイラーの吐くkernel codeは最適化が不十分だったので、手探りで最適化した。