并行与分布式计算 Linux-MPI

参考链接:
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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值