参考链接:
Linux下MPI环境的安装配置及MPI程序的编译运行
https://blog.csdn.net/lusongno1/article/details/61709460
(1)下载MPI安装包
去这里下载一个适合的安装包。
(2)安装包的解压
安装包所在的目录下,运行tar xzvf mpich-x.x.x.tgz。
(3)切换到解压出来的包目录下
cd mpich-x.x.x
(4)configure配置编译环境,我这里为它选择了一个安装路径。
./configure --prefix=/usr/local/mpich-x.x.x
这里可能会有一些出错提示,缺少编辑器啥的,按需求确认安装C、C++、F77和F90编译器即可。sudo apt-get install fort77 ,sudo apt-get install gfortran
(5)安装
sudo make
sudo make install
(6)可能还需要添加环境变量,设置用户权限等等,大概就像下面这样。不同的Linux系统不一样,不要照抄呀。参考参考就行。其实主要就是你要扒拉到你的安装文件夹下,看哪些文件夹比较重要的,要想办法添加到PATH中去。比如/usr/local/mpi/bin这个文件夹等等。
(7)MPI配置
创建文件/etc/profile.d/user.sh,包含以下内容:
export PATH=
P
A
T
H
:
/
u
s
r
/
l
o
c
a
l
/
m
p
i
/
b
i
n
e
x
p
o
r
t
M
A
N
P
A
T
H
=
PATH:/usr/local/mpi/bin export MANPATH=
PATH:/usr/local/mpi/binexportMANPATH=MANPATH:/usr/local/mpi/man
创建文件/etc/ld.so.conf.d/mpi.conf,包含以下内容:
/usr/local/mpi/lib
/usr/local/mpi/lib/shared
执行以下命令,使两个文件生效:
source /etc/profile.d/user.sh
source /sbin/ldconfig
在/etc/profile文件中添加库共享路径
执行sudo gedit /etc/profile,然后在其中加入一行
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
使该配置文件生效
source /etc/profile
(8)测试
在解压出来的MPI安装目录下有个examples文件夹,里面有若干示例程序可供测试。
编译测试:使用cd命令切换到示例程序文件夹下,使用mpicc hellow.c -o hellow进行编译。
运行测试:mpirun -np N hellow
这里的N改成一个常数,表示你要用来运行这个并行程序的节点。当然,如果不是在集群环境上,你一个CPU就一个节点,进程数也就是一个最多,本地机子默认的编号就是0。你N的不同无异于就是把程序跑N遍而已。
(9)SSH验证
节点之间传递消息,一般要先认证身份,每次传递都要认证身份比较麻烦。所以,可以搞一个“通行证”一样的东西,使得传递消息变得更加便捷。示例命令行代码如下:
ssh-keygen -t dsa
cp id˙dsa.pub authorized˙keys
chmod go-rwx authorized˙keys
ssh-agent $SHELL
ssh-add
(10)编程
初始化MPI环境:
MPI_Init(&argc, &argv);
获取并行环境参数(总进程数、本地进程编号等):
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
执行计算、通信等操作:
printf(”rank %d of %d: Hello, world!\n”, myrank, nprocs);
结束MPI环境:
MPI_Finalize();
//Example1
#include <stdio.h>
#include <mpi.h>
int main(int argc, char * argv[])
{
int myrank, nprocs;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD,&nprocs);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
printf("rank%dof%d:Hello,world!\n",myrank, nprocs);
MPI_Finalize();
return 0;
}
//Example2
#include <mpi.h>
int main (int argc, char *argv[])
{
int myrank, a;
MPI_Status stat;
MPI_Init (&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
a = myrank + 10;
if (myrank == 0)
MPI_Send (&a, 1, MPI_INT, 1, 9, MPI_COMM_WORLD);
else (myrank == 1)
MPI_Recv (&a, 1, MPI_INT, 0, 9, MPI_COMM_WORLD, &stat);
MPI_Finalize ();
return 0;
}