はじめに
Qiitaに書いてきた分子動力学法(Molecular Dynamics method, MD)関連の記事が溜まってきたのでまとめておく。新しいの書いたら追記していくかもしれない。僕が書いた奴じゃないのも含めている。
僕が書いた奴
分子動力学法ステップ・バイ・ステップ
分子動力学法をスクラッチから書いてみようというもの。
- その1 $O(N^2)$のルーチンまで
- その2 ペアリストの構築とBookkeeping法
- その3 メッシュ探索
- その4 少しだけ高速化
- その5 温度制御法を三種類実装してみる
- その6 圧力測定ルーチンの実装
SIMD化関連
- LJの力計算をフルアセンブラで書いてみる AVX2命令を使ってフルアセンブラでLennard-Jonse系の力計算を書いてみた。
- LJの力計算を組み込み関数で書いてみる 上記を組み込み関数で書き直した。
- LJの力計算を組み込み関数で書いて馬鹿SIMD化 組み込み関数で書いたところを4倍にループアンロールして馬鹿SIMD化してみた。
- LJの力計算のSIMD化(たぶん完結編) ペアリストを使った計算。ちなみにちっとも完結していない。
LJの力計算のSIMD化ステップ・バイ・ステップ
SIMD化しようと苦闘する過程を晒そうという試み。
- その0 SIMD化の方針について
- その1 ペアのループのソフトウェアパイプライニング
- その2 ソフトウェアパイプライニングの改良
- その3 ループの4倍展開
- その3.5 展開したループのSIMD化の途中経過。デバッグ方法など
- その4 実測(遅かった・・・○| ̄|_)
- その5 i粒子でソートしたものをソフトウェアパイプライニングしたものをSIMD化
- その6 ベクトルの転置を先にしたら早くなった話
数値積分法についての話題
- Velocity Verlet法とシンプレクティック積分 Velocity Verlet法がシンプレクティック積分になることの確認等
- Lie-Trotter公式の打切り誤差を調べる シンプレクティック積分の構築に使われるLie-Trotter公式の打切り誤差を確認
- 時間反転対称性とシンプレクティック積分
- Lie-Trotter公式における二次の対称分解 分子動力学法で、おそらく最も使われている二次のシンプレクティック積分(二次の対称分解)の精度の確認
- シンプレクティック変換と運動方程式の関係について 時間発展がシンプレクティックであることと、運動方程式が満たすべき条件の関係について
- ヤコビの公式とヤコビアンの性質と一般化リュービルの定理
解析力学の話
- 解析力学の幾何学的側面 シンプレクティック積分と影のハミルトニアン
- 解析力学の幾何学的側面 II 解析力学に現れる様々な多様体とリュービル演算子のエルミート性の持つ意味について
- 解析力学の幾何学的側面 III 運動方程式のベクトル場のdivergenceとヤコビアンの関係、および非ハミルトン系の場合について
- 解析力学の幾何学的側面 IV 微分形式を用いた運動方程式の幾何表現と、拡大空間について
- 解析力学の幾何学的側面 V 解析力学における温度の幾何学的定義について
その他の話題
- 調和振動子に作用させた熱浴のエルゴード性 調和振動子系をNose-Hooverで制御すると温度が正しく制御されない理由と回避方法
- 分子動力学法における熱浴の保存量 Nose-Hoover法や多変数熱浴における数値積分の保存量について
- MDループのソフトウェアパイプライニング:ステップ・バイ・ステップ 力計算カーネルをソフトウェアパイプライニングすることでIPCの向上をはかる
@kohnakagawa さんによるMD関連の記事
SIMD化、GPGPU化で早いコードを書く @kohnakagawa さんによるMD関連の記事まとめ。
GPGPU関連
AVX命令を用いたVerlet list構築のSIMD化
その他の話題
- Thrustを用いたhistogram作成 MDで必要となるヒストグラム作成の高速化
- 分子動力学シミュレーションにおける力計算のSIMD化 最内ループ展開と最外ループ展開のときの性能比較
- LJ力計算のGPGPU化 作用反作用の法則を使わないやり方がベストなのか?
まとめ
パッケージソフト使うのもいいけど、MDをゼロから組むのも高速化するのも楽しいからみんなでやろう!相互作用を限定すればコード量も大したことないし、ホットスポットがはっきりしているから高速化しやすいしね。