Ubuntu 18.04下MPICH的安装、配置及使用

文章目录

    • 常规
    • 安装
      • 下载mipch
      • 新建目录
      • 配置
      • 编译
      • 安装MPICH
      • 添加PATH
      • 测试1
      • 测试2
      • 测试3
      • 配置编译器
      • 问题
    • 单机和多机
      • SSH
        • 单机
        • 多机
      • 测试
        • 单机
        • 多机
    • 参考链接
      • 安装配置MPICH
      • ssh
    • OK,就这样吧,bye

MPI是目前最重要的并行编程工具,它具有移植性好,功能强大,效率高等多种优点,而且有多种不同的免费,高效,实用的实现版本,几乎所有的并行计算机厂商都提供对它的支持,这是其它所有的并行编程环境都无法比拟的。MPI于1994年产生,虽然产生时间相对较晚,由于它吸收了其它多种并行环境的优点,同时兼顾性能、功能、移植性等特点,在短短的几年内便迅速普及,成为消息传递并行编程模式的标准,这也从一个方面说明了MPI的生命力和优越性。
MPI其实就是一个-库,共有上百个函数调用接口,在FORTRAN 77和C语言中可以直接对这些函数进行调用,MPI提供的调用虽然很多,但最常使用的只有6个,只要会使用FORTRAN 77或者是C,就可以比较容易地掌握MPI的基本功能,只需通过使用这6个函数就可以完成几乎所有的通信功能。由于Fortran90 和C++的使用也十分广泛 MPI后来又进一步提供对Fortran 90和C++的调用接口,这更提高的MPI的适用性根据我们的经验,只要掌握了FORTRAN77和C的程序员,哪怕一开始对MPI并行程序设计一无所知,只要通过一定的培训和练习,是可以很快掌握MPI的基本功能并通过使用它来编制并行程序的。
但是要全面掌握MPI,必须通过大量的练习并需要更长的时间…
这个的话没有太多教程,就算有可能也不是特别好,因为我找了好久,特别是多机,都说得比较模糊,我在尝试成功之后就把我的过程记录下来,应该没有太大问题。

常规

后续为常规安装步骤,使用默认配置选项,建立nemesis communication device和Hydra process manager针对C、C++、Fortran-77和Fortran-90(如果有编译器的话),但是没有报错和调试功能?如果make的时候使用VPATH,建立的process会占据本地disk为了speed。
需要的文件有

  • mpich源码
  • C编译器
  • C++或Fortran编译器(如果你需要使用这些语言)

安装

下载mipch

点击此处下载mpich源码,我选择的是mpich-3.3 (stable release)(MPICH平台)

新建目录

将下载好的mpich-3.3.tar.gz复制到一个文件夹下,解压
tar xfz mpich-3.3.tar.gz
新建安装目录,这我就直接在我的文件夹里新建了
mkdir mpich-install
然后选择一个build目录,build将会非常快如果它在文件系统被配置和执行,如果能和资源目录分开也很好的,这个目录在安装成功之后会有一个examples文件夹,里面是MPICH的示例程序,最好复制出来以便测试,不然重启之后tmp就清空了。
mkdir /tmp/mpich-3.3

配置

配置MPICH,切换至路径
cd /tmp/mpich-3.3/
执行配置程序
/home/kang/Desktop/mydir/MPICH/mpich-3.3/configure -prefix=/home/kang/Desktop/mydir/MPICH/mpi-install |& tee c.txt
此步骤可能会报错,比如我报错找不到任何Fortran编译器,两个解决措施,安装一个,或者忽略这个,我选择安装。
安装gfortran
sudo apt-get install gfortran
安装完之后再次执行上面的配置命令,在经过一堆Check之后,如果成功,会如下图所示
Ubuntu 18.04下MPICH的安装、配置及使用_第1张图片
使用tee命令可以同时将显示在屏幕的内容输出到文件中

编译

make进行编译
make |& tee m.txt
或者make 2>&1 | tee m.txt
如果make完成了应该能看到下面的图
Ubuntu 18.04下MPICH的安装、配置及使用_第2张图片

安装MPICH

执行下列命令进行安装
make install |& tee mi.txt
Ubuntu 18.04下MPICH的安装、配置及使用_第3张图片

添加PATH

export PATH=/home/kang/Desktop/mydir/MPICH/mpi-install/bin:$PATH
是使用which mpicc或者mpiexec测试时候添加到了PATH。
这似乎只是临时添加的PATH,因为重启之后他提示找不到文件,就是说路径没了,因此需要永久性添加PATH,具体操作如下
编辑vim /etc/profile文件内容,添加之前你使用的临时导入的指令,如下图所示
Ubuntu 18.04下MPICH的安装、配置及使用_第4张图片
随后执行指令source /etc/profile更新,即可生效。

测试1

执行ssh othermachine date或者rsh othermachine date查看需不需要使用密码,需要的话就需要重新配置。
使用如下命令进行测试,如正确,则安装成功,使用的examples文件夹是在build和make之后在tmp下生成的
mpirun -np 10 ./examples/cpi,这里的examples就是上面让你复制的那个文件夹。
Ubuntu 18.04下MPICH的安装、配置及使用_第5张图片

测试2

编写代码如下保存为hello.c

#include "mpi.h" 
#include  
 
int main (int argc, char *argv[]) { 
   int i; 
   int id;               /* Process rank */ 
   int p;                /* Number of processes */ 
   void check_circuit (int, int); 
 
   MPI_Init (&argc, &argv); 
   MPI_Comm_rank (MPI_COMM_WORLD, &id); 
   MPI_Comm_size (MPI_COMM_WORLD, &p); 
 
   for (i = id; i < 65536; i += p) 
      check_circuit (id, i); 
 
   printf ("Process %d is done\n", id); 
   fflush (stdout); 
   MPI_Finalize(); 
   return 0; 
} 
 
 
/* Return 1 if 'i'th bit of 'n' is 1; 0 otherwise */ 
#define EXTRACT_BIT(n,i) ((n&(1<

执行mpicc -o hello hello.c编译程序。
执行mpirun -n 2 ./hello运行程序,-n参数值表示为两个处理器运行,mpiexec也可以,运行结果如下图所示
Ubuntu 18.04下MPICH的安装、配置及使用_第6张图片

测试3

编写helloworld.c代码如下所示

#include "mpi.h"
#include 
#include 
void main(argc,argv)
	int argc;
	char *argv[];
{
	int myid,numprocs;
	int namelen;
	char processor_name[MPI_MAX_PROCESSOR_NAME];

	MPI_Init(&argc,&argv);
	MPI_Comm_rank(MPI_COMM_WORLD,&myid);
	MPI_Comm_size(MPI_COMM_WORLD,&numprocs);
	MPI_Get_processor_name(processor_name,&namelen);

	fprintf(stderr,"hello,world!Process %d of %d\n",myid,numprocs,processor_name);
	MPI_Finalize();
}

执行mpicc -o helloworld helloworld.c编译程序。
执行mpirun -n 4 ./helloworld运行程序,结果如下图所示
image

配置编译器

我在某个教程上看是可以配置的,但是我并没有配置,好像没出什么问题。

问题

  • tmp文件夹的build和make的文件似乎重启会消失,所以安装好的测试用例文件夹examples会不见,运行其会提示报错,把文件夹复制出来就好了
  • PATH那一步的添加似乎是一次性的,重启之后就会没有,因此需要重新在终端输入该命令添加PATH,至于有没有永久的方法,是有的,百度一下就有啦
  • 其实这个时要求用ssh和rsh进行通信的,在后面会配置ssh的
  • 如果想集群的话获取需要配置ssh

单机和多机

SSH

单机

联机运行的主要难点就是如何建立ssh连接,不仅仅是要安装ssh服务,还需要设置和对应的公钥和私钥。
如果报错
ssh: connect to host localhost port 22: Connection refused
那么因为你没有安装ssh的服务端,执行指令ps -e |grep ssh,如下图所示
Ubuntu 18.04下MPICH的安装、配置及使用_第7张图片
如果你只发现了ssh-agent,那么说明只有客户端,需要安装服务端程序,执行下述命令安装

sudo apt-get install openssh-server

安装好之后,再次运行ps -e|grep ssh,你应该就会发现sshd的存在了,这就是我们需要的。

开启
service sshd start
关闭
service sshd stop

现在执行命令ssh localhost(127.0.0.1),然后输入你的系统登陆密码,不出问题的话应该就可以正确地登陆到本机了。
但是mpich需要的是免密登陆,因此安装好之后需要生成密钥进行配置,执行以下命令(在第一步生成密钥的时候,我们选择不设置密码,直接回车即可)

//生成密钥
ssh-keygen -t rsa 	//使用rsa加密
//利用公钥生成授权文件
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
添加至信任
ssh-add

Ubuntu 18.04下MPICH的安装、配置及使用_第8张图片
随后使用ssh登陆本机,会发现不需要输入密码了,如下图所示
Ubuntu 18.04下MPICH的安装、配置及使用_第9张图片
至此,免密登陆本机已经成功了

多机

需要配置/etc/hostname主机名和/etc/hosts的主机IP映射,由于我不知道实体机和虚拟机怎么映射IP,因此采取VM开两个虚拟机,ubuntu和kali进行测试,在hosts文件中需要对主机名和IP地址进行映射,格式如下图所示吧,我这应该算是虚拟机里的内网地址吧,局域网。
ps.查看IP地址如下
Ubuntu 18.04下MPICH的安装、配置及使用_第10张图片
ubuntu的主机配置如下所示
Ubuntu 18.04下MPICH的安装、配置及使用_第11张图片
Ubuntu 18.04下MPICH的安装、配置及使用_第12张图片
kali如下所示
image
Ubuntu 18.04下MPICH的安装、配置及使用_第13张图片
至此主机的配置就搞定了,然后进行ssh的配置,关键就是ssh的两个主机免密登陆配置,这个配置网上有很多,但是似乎都不太全,记录一下。
大体步骤分为四步

  • 安装ssh(如果没有安装的话)
  • 生成公钥和私钥
  • 将各个节点的主机公钥添加到自己的授权文件中
  • 修改文件权限

安装ssh就直接安装,如ubuntu是sudo apt-get install openssh-server,kali是sudo apt-get install ssh,不同系统似乎不太一样。
安装好之后需要配置一下config
/etc/ssh/sshd_config
需要将如下的三个配置取消注释,如果没有的话主动添加进去就行了
Ubuntu 18.04下MPICH的安装、配置及使用_第14张图片
随后重启ssh服务生效,ubuntu是service sshd restart,kali是service ssh restart
下面生成密钥
以下步骤除特殊说明外,各节点操作相同,以ubuntu为例
执行命令ssh-keygen -t rsa生成公钥和私钥,一路回车就行了,我们不需要密码。
将kali生成的id_rsa.pub公钥文件复制到ubuntu的~/.ssh文件夹中,可以重命名为id_rsa_from_kali.pub方便区分,只是方便操作,在哪其实无所谓。
执行如下命令

#将本机公钥添加到授权文件中
cp ~/.ssh/id_rsa.pub authorized_keys
#将节点主机的公钥添加到授权文件中
cat ~/.ssh/id_rsa_from_kali.pub >> ~/.ssh/authorized_keys

授权文件内容如下图所示
Ubuntu 18.04下MPICH的安装、配置及使用_第15张图片
这个授权文件在这个集群中其实是通用的,将其直接复制到kali的~/.ssh文件夹下即可
随后对ubuntu和kali都进行添加私钥的操作ssh-add ~/.ssh/id_rsa
到这应该差不多了,但是其实还是有点小问题,就是在进行ssh连接的时候,主机名有点小问题,得用户加主机名才行,不能单纯的主机名,然后呢,我进行一个测试,在kali上测试一下,ssh连接到ubuntu
ssh kang@ubuntu
Ubuntu 18.04下MPICH的安装、配置及使用_第16张图片
可以看到成功连接了,说明ssh好了,下面要试着继续弄mpich了。
其实还需要进行权限的分配的,但是默认似乎就可以用,我就不管了

测试

单机

此时我们就需要使用到machinefile文件了,编写文件内容如下所示

ubuntu 		# Run 1 process on ubuntu
#ubuntu2:4 	# Run 4 processes on ubuntu2

Ubuntu 18.04下MPICH的安装、配置及使用_第17张图片
其中前面的为主机的host名,冒号后面为运行的线程数,按理说格式应该是[IP] [HOSTNAME],如果是多机的话需要这么做,但是此时我是单机,因此不需要,保存退出。
执行命令

mpiexec -n 5 -f machinefile ./examples/cpi

结果如下图所示,不再提示SSH连接22端口失败了,而且可以看到主机名也变为我们localhost的ubuntu了。
Ubuntu 18.04下MPICH的安装、配置及使用_第18张图片
至此我觉得这个东西初步应该就这么解决了。

多机

在进行连机之前切记切记切记,各个主机的安装目录,运行程序所处的路径必须完全一样
我就是因为安装路径不一样,一个是mpi-install另一个是mpich-install,看了好久都没发现如果路径里有username,如/home/kang之类的,还要确保所有主机的用户名一致,不然路径也会变化
然后编写machinefile,可以在主机名后面加上冒号和数字,表示这个主机运行的线程数

ubuntu
ubuntu-node

之后执行如下命令,在这里文件的路径用绝对路径是为了保证一致性,避免其他主机找不到文件
mpiexec -f ~/Desktop/mydir/MPICH/exp/machinefile -n 4 ~/Desktop/mydir/MPICH/exp/examples/cpi
运行结果如下
image
这里看着没毛病,其实底下还有一堆隐约像报错又不像的东西我没有截进来。
难点主要就是保证路径什么的一致把,就没啥了
我给ubuntu重装了一下,感觉出了点问题,真奇怪,估计是没卸载干净吧,至少现在有点结果了,就问题不大了。

参考链接

安装配置MPICH

【linux 配置mpich环境ssh connect to host port 22 no route to host错误解决办法】 – 加贝木苇
Linux系统(Ubuntu)下,MPI的安装与配置 – 惰性求治
Linux CentOS下安装MPICH以及运行第一个并行程序 – houqingdong2012
【Linux添加$PATH环境变量】 – 百度百科

ssh

【Linux安装SSH本机免密登录】 – 很吵请安青争
【ubuntu下MPICH的安装以及多机环境运行】 – saihang1992


OK,就这样吧,bye

你可能感兴趣的:(Linux,MPICH,MPI,并行计算,并行程序,集群计算)