最近在编译一个老的有限差分的波场模拟程序,基于fortran的mpi程序。说来奇怪,mpi程序并不是每次都能编译成功,多数时候只能用串行方式np=1才能正确执行,但是一直没找到问题在哪。

关于MPI命令

目前常用的MPI库有MPICHopenmpIntel 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环境下目标程序无法实现并行。我猜测,也许是ifortmpif90root环境下安装(我是喜欢这样的),本地user环境尽管有执行权限但因为用户组的不同在执行的MPI过程中对内存的share仍有可能出现问题(忽略忽略)。

因此,我试着把ifortmpif90都在user环境下安装,然后目标程序也在user环境下编译运行,结果仍然是糟糕。OK,I gave up.

root环境编译、执行MPI目标程序

是的,我只能说这是目前我认为肯定OK的MPI程序执行方法,尽管我曾经也是在user环境下编译、执行、工作的。

Yes,未完待续!