パフォーマンス改善

GPUでのPME(プロセス間通信)の長距離相互作用をサポートするように実装

単一のGPUを使用して、長距離のPME相互作用の計算を高速化できます。この機能により、特にGPUとCPUのバランスが取れたハードウェアでも、2016年のバージョンに必要なよりも少ないCPUコア(2~4コア)でほぼ同等の速度を実現できます。GPUとCPUのバランスが取れたハードウェアでも、わずかながらパフォーマンスが向上し、強力なGPUを持つハードウェアでも、効果的なシミュレーションを実行できるようになりました。

現在、PMEで使用されるGPUは、短距離相互作用で使用されたGPUと同じGPUであり、また同じシミュレーションの同じランクにあるGPUである必要があります。または、PMEのみで使用されるランクにある任意のGPUを使用することも可能です。`mdrun -pme gpu`は、PMEがGPU上で実行されることを要求します。|Gromacs|がサポートするすべてのCUDAバージョンとハードウェア世代でこのコードを実行できます。これには、CUDA 9.0とVolta GPUが含まれます。ただし、GPUでのPMEの使用には、すべての組み合わせがサポートされているわけではありません。特に、FEP(分子動力学法)の計算はまだ利用できません。

ユーザーマニュアルは、新しい機能に対応するように更新され、さらに詳細なドキュメントが提供されます。

PME のスプレッドとガッディングに対する、より多くの SIMD イントリックスのサポートを追加

典型的なシミュレーションシステムにおけるPMEの広がり/収集処理において、Intel KNLプロセッサで約11%の速度向上が実現されました。

単純な更新のSIMDインプリックス版を追加

単純なケースで、圧力を伴わない「ジャンプ」動作と、最大1つの温度結合グループの場合、速度と座標の更新が、シミュレーション速度の向上を目的として、SIMD命令を利用して実装されました。

Urey-Bradley の角度カーネルの SIMD インプリックス版を追加

エネルギーとシフト力を必要としないステップの場合、このカーネルはパフォーマンスを向上させ、これにより、特にCHARMM力場を使用した場合、GPUによる実行時に発生するパフォーマンスボトルネックを解消できます。

AMD Ryzen での自動実行設定時に、最大 16 スレッドの OpenMP を使用する

AMD Ryzen は、通常、OpenMP を使用した場合、MPI よりもわずかに優れたパフォーマンスを発揮します。これは、8 コアのチップで利用可能なすべての 16 スレッドを使用した場合に特に顕著です。

128ビット AVX2 SIMD を使用した AMD Ryzen

Ryzenは256ビットのAVX2をサポートしていますが、内部ユニットは1サイクルあたり、単一の256ビットの命令または2つの128ビットのSIMD命令のいずれかを実行するように構成されています。当社のカーネルの多くは、より広いSIMDに対してわずかに効率が低いため、これにより約10%のパフォーマンスが向上します。

AMD Zen で、より高速な nbnxn SIMD カーネルを選択する

AMD Zen では、表形式の Ewald カーネルは常に解析的なカーネルよりも高速です。また、AVX2_256 を使用した 2xNN カーネルは、4xN カーネルよりも高速です。これらの高速な選択は、実行時に CpuInfo に基づいて決定されます。

参照:2328

グループ・スキームのSIMDを有効化 (GMX_SIMD=AVX2_128)

グループ・スキームのカーネルは、AVX_128_FMA および AVX_256 拡張機能の両方から AVX 命令を使用できます。ただし、新しい AVX2_128 拡張機能に対応するハードウェアも AVX_256 をサポートしているため、グループ・スキームのカーネルには、そのようなサポートを有効にします。

AVX-512 FMAユニットを検出し、最適なSIMDを選択する

最近のIntel x86ハードウェアには複数のAVX-512 FMAユニットが存在し、これらのユニットの数と、CPUがクロック周波数を選択する方法との相互作用によって、|Gromacs|でAVX-512 SIMDサポートを使用しない方が有利になる場合があります。特に、ハードウェアのユニット数を問い合わせる方法がないため、CMakeとmdrunの実行時に、これらのユニットを使用した場合と使用しない場合のパフォーマンスを比較し、最適なバージョンを推奨します。これにより、同じ世代のIntelハードウェアから構成されたクラスタのフロントエンドノードで|Gromacs|をビルドすることが、計算ノードには適さない場合があります。

nbxn のバッファのクリアを高速化

非相互作用 GPU カーネルの条件式を調整

GPUコンパイラは、内側のループの条件式における簡単なループ変数の最適化をスキップしています。条件式の部分を事前に計算し、論理演算の代わりにビット演算を使用することで、ほとんどのコンパイラでパフォーマンスを最大5%向上させることができます。