how to run MPI programs?
Contents
最近在编译一个老的有限差分的波场模拟程序,基于fortran
的mpi程序。说来奇怪,mpi程序并不是每次都能编译成功,多数时候只能用串行方式np=1
才能正确执行,但是一直没找到问题在哪。
关于MPI命令
目前常用的MPI库有MPICH
,openmp
,Intel MPI
, 不得不说这确实容易让人混淆。关键这些执行程序都是相同或者相似的,能混用吗?
FC | MPICH | openmp | Intel MPI – | –| –| F | mpif90 / mpifort | mpif90 / mpifort | mpif90(gfortran) / mpiifort(ifort) C | mpicc(c) / mpicxx(c++) | mpicc(c) / mpicxx(c++) | mpiicc(icc) / mpiicpc(icpc)
如何区分这些函数库?多数时候,MPI程序我都是intel compiler
编译的,咱们拿fortran
来举例子:
1. openmp,语法相对简单,轻量级MPI库;
2. MPICH和Intel MPI,都是典型的MPI库,语法基本上一致、复杂;
3. Intel MPI,毕竟是收费的,并行效率更高;
4. 用Intel MPI的mpirun来执行MPICH编译的可执行文件是可行的,且相对MPICH的mpirun更高效;
MPI编译
指定MPI库函数绝对路径
既然这些函数库都是这么相似,在这几种函数库都安装的情况下,我们编译的时候最好使用绝对路径
来指定使用那种MPI库。
常见错误Cannot read from remote process
?
这个问题困扰了很多人,ifort
安装顺利,MPICH库安装顺利,目标程序编译顺利,串行执行顺利,可并行执行np>1
就是出错。但是很多网友都强调root
环境,目标程序的编译和执行是OK的,就是在user
环境下目标程序无法实现并行。我猜测,也许是ifort
和mpif90
在root
环境下安装(我是喜欢这样的),本地user
环境尽管有执行权限但因为用户组的不同在执行的MPI过程中对内存的share仍有可能出现问题(忽略忽略)。
因此,我试着把ifort
和mpif90
都在user
环境下安装,然后目标程序也在user
环境下编译运行,结果仍然是糟糕。OK,I gave up.
root
环境编译、执行MPI目标程序
是的,我只能说这是目前我认为肯定OK的MPI程序执行方法,尽管我曾经也是在user
环境下编译、执行、工作的。
Yes,未完待续!
Author F. Cheng
LastMod 2018-02-24