Gromacs4雜談
隨便談談gromacs4。
新支持僅xy方向的PBC,以前版本實現二維周期邊界條件只能靠那個方向增加很厚的真空層來實現。可以與WALL組合使用(WALL也只能用于二維周期邊界條件)。nwall設2就是在box的z值位置上加兩個wall,此時可以用控壓和ewald相關靜電加和方法。設1就是z=0上一個wall。
新支持周期性分子。
pull代碼作了完全改寫,以前的ppa文件不能用了,而是在mdp里面設。
grompp去除了-np設置,也就是不用事先指定tpr在各個節點上的負載怎么分配,在mdrun時候默認是使用域分解方法均衡負載,這樣并行或是串行都可以用一個tpr了,很方便。用法還是mpirun -np 4 mdrun....同時grompp也去掉了shuffle和sort選項,對于默認的域分解方法已經沒用了。在某些情況下不能用域分解,比如pbc=xy,界時還得用-pd (particle decomposition)
新加了個checkpoint設計,默認每隔15分鐘更新一個.cpt。有一些好處。mdrun的時候用-cpt調整多長時間寫一次,-1就是不寫cpt。每個新的.cpt生成之后會把老的.cpt改名為_prev.cpt的后綴,再之前的.cpt就刪了。這個cpt里面包含了速度、坐標、能量,文件并不大,只需要有這個.cpt,斷的工作就可以完整繼續,比如mdrun用-cpo參數設的checkpoint文件名是sdf.cpt,mdrun -v -deffnm a-sol-md4 -cpi sdf就可以繼續了,會接著checkpoint位置算直到預定時間,生成新的末尾是part0002的trr/log/edr。以前要繼續算必須用trjconv,trr軌跡得讀一遍生成新的.tpr,而且繼續開始時間受制于.trr里面的一些東西的保存頻率。
令我不太舒服的是mdrun的-v選項開了之后默認是每100步輸出一次剩余時間和當前步數,以往是10步輸出一次。
mdrun有了-pforce,可以設定受力大于多少的原子被打印出來。
目前的版本開了-enable-fortran選項會編譯不過去,解決方法是
把src/gmxlib/libxdrf.c的第1156行#define XDR_INT_SIZE 4挪到第68行,即在#ifdef GMX_FORTRAN之前。
gmx4最主要的改進是并行效率問題,這是gmx最大詬病。我對此進行了詳細的測試,體系是gmxbench里面d.dppc,包含12萬個原子,5000步,是個磷脂膜體系。把庫侖作用改成了PME,其它沒變。測試平臺Q6600 oc 3.2,ifort,gcc,mpich2,編譯方法完全一致,優化參數全開。
下面pc的p代表parallel,沒p就是串行版本。pc的c代表沒開-enable-fortran,f代表開了。
不知道是什么原因,可能是有個體特異性,不開-enable-fortran,gmx4并行效能反到不如gmx3.3.3開了shuffle,當然比不開shuffle還是強很多。很多人感覺gmx4并行效率大增,實際上是有些人不知道以前gmx應該開-shuffle -sort!gmx4對均衡負載很注重,在跑的時候加了-v還會輸出imbalance的情況(imb)。
注意一點,mdrun的時候開-dlb yes可以使imb也就是不均衡負載降低,在我的Q6600上,可以看到輸出的imb由4%降到了1%以下,性能能提高約3%。默認是auto,似乎是沒開,和-dlb no差不多。dlb只能用于-dd,也就是默認的域分解。對不均勻體系應該更好。
但是gmx4并行版本如果用了-enable-fortran,性能激變,竟達到gmx3.3.3默認方式并行的3/2。
對于串行版本,奇怪的是gmx4比gmx3.3.3還慢(在A64 3000+上gmx4卻比gmx3.3.3略快),但開了-enable-fortran后,gmx3.3.3長進不大,無論是并行還是串行。gmx4卻獲益非淺,超過gmx3.3.3+fortran,尤其是并行速度,達到了新高。
總之對于具體體系和具體配置得到的數據還不能說明問題,而且因為條件所限沒法試gmx4集群性能,但是我至少做出倡議:用gmx4要用-enable-fortran。用gmx3.3.x最好用-enable-fortran,并行計算一定要在grompp時設-shuffle -sort,開-dlb yes
PME gmx4 pc -np 4
NODE (s) Real (s) (%)
Time: 802.000 802.000 100.0
13:22
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 44.139 8.466 1.077 22.278
PME gmx4 pf -np 4
NODE (s) Real (s) (%)
Time: 611.000 611.000 100.0
10:11
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 57.991 11.109 1.414 16.972
PME gmx3.3.3 pc -np 4
NODE (s) Real (s) (%)
Time: 902.000 902.000 100.0
15:02
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 38.744 8.223 0.958 25.056
PME gmx3.3.3 pf -np 4
NODE (s) Real (s) (%)
Time: 880.000 880.000 100.0
14:40
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 39.710 8.428 0.982 24.444
PME gmx3.3.3 pc -np 4 -shuffle
NODE (s) Real (s) (%)
Time: 750.000 750.000 100.0
12:30
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 46.687 9.891 1.152 20.833
PME gmx3.3.3 pf -np 4 -shuffle
NODE (s) Real (s) (%)
Time: 737.000 737.000 100.0
12:17
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 47.498 10.063 1.172 20.472
PME gmx3.3.3 pc -np 4 -sort
NODE (s) Real (s) (%)
Time: 901.000 901.000 100.0
15:01
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 38.787 8.232 0.959 25.028
PME gmx3.3.3 pc -np 4 -sort -shuffle
NODE (s) Real (s) (%)
Time: 724.000 724.000 100.0
12:04
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 54.572 10.250 1.193 20.111
=================serial version comparion
PME gmx4 c
NODE (s) Real (s) (%)
Time: 2824.000 2824.000 100.0
47:04
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 12.380 2.449 0.306 78.444
PME gmx4 f
NODE (s) Real (s) (%)
Time: 1975.000 1975.000 100.0
32:55
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 17.695 3.440 0.437 54.861
PME gmx3.3.3 c
NODE (s) Real (s) (%)
Time: 2143.480 2144.000 100.0
35:43
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 16.305 3.119 0.403 59.541
PME gmx3.3.3 f
NODE (s) Real (s) (%)
Time: 2109.680 2109.000 100.0
35:09
(Mnbf/s) (GFlops) (ns/day) (hour/ns)
Performance: 16.574 3.170 0.410 58.602