欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(二)MS-MPI多机通信

程序员文章站 2022-07-12 21:34:02
...

1.关于MPI多机通信

一台计算机处理数据的能力是有限的,MPI的主要作用就是用来实现并行计算机,即将多台主机联机,实现大规模、高性能的计算机机群。我们知道一台计算机同时运行多个进程时,由于计算机资源是共享的,多个进程都会占用一些资源,每个进程运行的效率就会降低,比如当一台计算机同时跑着多个大型应用时会变得非常卡顿。所谓多机通信,可以理解为将本应该在同一台主机上运行的多个进程分配到多台主机上,以往多进程间的通信也就演变成多主机间的通信,就能同时利用多台主机的计算资源,从而提高计算效率。

2.选择MS-MPI的原因

就纯粹的多机通信来说,我更推荐使用Intel MPI,它对于初学者非常友好,Intel公司提供了很多开发资料,也有很多Sample。相对来说微软提供的关于MS-MPI的学习资料就没有那么多了,也可能是我没有找到的原因。我是在Windows系统上开发程序,在我的实践中,Intel MPI和OpenGL放到一起时,可以在本地模式下创建OpenGL窗口,在联机情况下却无法创建窗口,MPI程序和OpenGL程序分开来都能运行,这个问题困惑了我两周左右,在*上提问也没有得到用之有效的解决办法,只能选择MS-MPI代替。但MS-MPI不愧是亲生的,完全支持MPI + OpenGL的开发框架,而且相对Intel MPI更轻量,开发更方便,这一点让我很欣慰,MS_MPI多机通信的实现过程中也有几个需要注意的点,下面会做介绍。

1)注意点1:环境配置

多机通信中,有些堪称苛刻的条件需要满足:这些主机必须使用相同的用户名(管理员权限)和相同的密码登录;同时MSMPI的安装路径也必须相同,MPI SDK的安装路径可以不同,这一点十分重要;另外在程序运行之前,必须将相同的程序复制到各个主机的相同路径下;然后,各个主机需要到MPI的bin目录下使用cmd命令执行smpd -d指令,该窗口要一直开着,不能关闭。

这一部分很重要,要确保都没有问题才可以,再总结一遍:

  • 相同的用户名(管理员权限)和密码
  • 相同的MPI安装路径
  • 相同的程序,要放在相同的路径
  • 同时开启smpd -d,窗口不能关闭

2)注意点2:网络配置

多机通信中,多个主机需要在同一局域网下,有相同的网络掩码。这个局域网可以是有线也可以是无线的。在我的实践中,我测的是两台主机之间的通信,使用我的个人手机发热点,分别得到两台主机的IP地址:192.168.43.192和192.168.43.219。这在之后会用到。

3)注意点3:有自己的一套指令方式

MS-MPI官网提供的学习教程(How to compile and run a simple MS-MPI program)只有这么一个,好在也提供了单机测试和多机测试的指令方式mpiexec -hosts n hostA 1 hostB 1… -wdir,和Intel MPI的指令虽然大体上很像,但对于从Intel MPI转到MS-MPI的开发者来说可能会有些不适应。

3.一个多机通信的例子

这里还使用下面这个两个进程发int型数据的例子。

#include <iostream> 
#include <mpi.h> 

int main(int argc, char* argv[]) 
{ 
	MPI_Init(&argc, &argv); 
	
	int RankID; 
	MPI_Comm_rank(MPI_COMM_WORLD, &RankID); 
	
	if (0 == RankID) 
	{ 
		int SendNum = 16; 
		MPI_Send(&SendNum, 1, MPI_INT, 1, 0, MPI_COMM_WORLD); 
	} 
	else if (1 == RankID) 
	{ 
		int RecvNum = 0; 
		MPI_Recv(&RecvNum, 1, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 
		std::cout << "Receive from rank 0: " << RecvNum << std::endl; 
	} 

	MPI_Finalize(); 
	return 0; 
} 

多机通信前,需要

  • 先将多台主机使用相同的用户名和密码登录;
  • 连到相同的局域网下,关闭防火墙,获取其IP地址,确保相互之间可以ping通;
  • 将相同的源码复制到多台主机里相同的路径下,如我当前的工程所在的路径在F:\盘下,那么也将该工程复制到其他主机的F:\盘下;
  • 打开到MPI的bin目录,运行cmd,执行smpd -d;
  • 程序运行方式前面有提过,具体的指令如下:mpiexec -hosts 2 192.168.43.192 1 192.168.43.219 1 "F:\MPITest001\Debug\MPITest.exe"
    其中-hosts表示程序将会在多台主机上运行,2表示主机的数量为2,所以后面要跟2个主机IP地址,每个IP后面有个1表示在该台主机上使用1个进程,最后跟程序生成的可执行文件。