根据这个帖子,可以了解到:
根据支持的并行方式的不同,CP2K分为四个版本:
sopt:只能单机单核计算,无法并行。s意为single
ssmp:OpenMP并行,可以单机多核运行。smp意为Symmetric multiprocessing
popt:MPI并行,可以单机并行也可以跨节点并行。p意为parallel
psmp:MPI+OpenMP混合并行,可以单机并行也可以跨节点并行
sopt版严格等价于ssmp版结合OMP_NUM_THREADS=1,popt版严格等价于psmp版结合OMP_NUM_THREADS=1。
那么对于实际的使用来说,这里给出一个经验:
对于单机运行cp2k这种情况来说,这里选择ssmp来运行,对于ssmp来说他是多进程的版本,但是每次启动时实际调用的进程数量不一定,所以这里在环境变量中(bashrc)添加下面的信息:
export OMP_NUM_THREADS=48 #数量设为单个CPU的最大物理内核
而在运行时,由于有两个cpu并且有每个物理核心有两个线程,因此命令如下:
mpirun -n 4 cp2k.ssmp -i fayalite.inp
通过这样设置,可以保证cp2k的对计算资源的利用最大化,并且避免运行时出错,如果你细心观察会发现,每个cp2k.ssmp的cpu占用也不一定是4800%,而是会动态的调整,一般不会达到最大值。
这里对于fayalite.inp的benchmark结果:
两颗7642跑出最好成绩:680s。
两颗8136跑出2026s。
经过测试,-n 8 & OMP_NUM_THREADS=24和 -n 2 & OMP_NUM_THREADS=64 都跑出1020s左右的成绩,因此-n 设为cpu数量*单核线程数,OMP_NUM_THREADS 设为单颗CPU物理内核数可能时效率最大的选择。