Linux下安装mpi(单节点和docker多节点)

初学mpi的笔记,安装的基本操作。

--

单节点

1、下载安装。

在http://www.mpich.org/static/downloads找版本

1wget http://www.mpich.org/static/downloads/3.3/mpich-3.3.tar.gz
2tar xzf mpich-3.3.tar.gz
3mkdir /home/XXXX/MPI
4cd mpich-3.3
5./configure --prefix=/home/XXXX/MPI --disable-fortran
6make && make install

2、环境变量

1vi ~/.bashrc
2
3添加这两行:
4export MPI_ROOT=/home/XXXX/MPI
5export PATH=$MPI_ROOT/bin:$PATH
6
7source  ~/.bashrc

3、Hello world

1touch hello.cpp 
2mpicxx hello.cpp -o hello
3mpirun -n 4 ./hello
 1#include <iostream>
 2#include <string.h>
 3#include <mpi.h>
 4using namespace std;
 5const int max_string = 100;
 6 
 7int main ()
 8{
 9    int comm_sz=0;
10    int my_rank=0;
11    char greeting[max_string];
12    MPI_Init(NULL,NULL);
13    MPI_Comm_rank(MPI_COMM_WORLD,&my_rank);
14    MPI_Comm_size(MPI_COMM_WORLD,&comm_sz);
15 
16     if(my_rank!=0){
17        sprintf(greeting,"Greetings from process %d of %d!",my_rank,comm_sz);
18        MPI_Send(greeting,strlen(greeting),MPI_CHAR,0,0,MPI_COMM_WORLD);
19    }
20    else{
21        cout<<"Greetings from process "<<my_rank<<" of "<<comm_sz<<"!"<<endl;
22        for(int i=1;i<comm_sz;i++){
23            MPI_Recv(greeting,max_string,MPI_CHAR,i,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);
24            cout<<greeting<<endl;
25        }
26    }
27    MPI_Finalize ();
28    return 0;
29}

多节点

1、docker-compose.yml

- 在网上找到一个配好了mpi所需环境的image orwe184/ubuntu-16-mpi。

- 使用depends_on来设置启动顺序,仅仅是为了按顺序分配IP地址。

- 使用ports分别设置对host开放的端口。

- 使用volumes设置主机与container的共享目录。

- 使用tty来使container持续运行,而不是一启动就自动关闭。

- 最后docker compose -d up启动。三个节点自动被被配置在同一网络中。

 1services:
 2  mpi0:
 3    image: orwel84/ubuntu-16-mpi
 4    container_name: mpi0
 5    ports:
 6      - "19010:22"
 7    volumes:
 8      - ./:/src
 9    tty: true
10
11  mpi1:
12    image: orwel84/ubuntu-16-mpi
13    container_name: mpi1
14    depends_on:
15      - mpi0
16    ports:
17      - "19011:22"
18    volumes:
19      - ./:/src
20    tty: true
21
22  mpi2:
23    image: orwel84/ubuntu-16-mpi
24    container_name: mpi2
25    depends_on:
26      - mpi1
27    ports:
28      - "19012:22"
29    volumes:
30      - ./:/src
31    tty: true

2、三个container的免密传输

  • 分别生成密钥:ssh-keygen -t rsa

  • 分别把密钥都写入共享目录中的authorized_keys文件中:cat .ssh/id_rsa.pub >> /src/authorized_keys

  • 分别将authorized_keys文件拷贝到.ssh目录下:cp /src/authorized_keys ~/.ssh

  • 这时应该就可以免密传输了。但是实际上可能会一些问题,于是:

​ - 1.检查ssh服务是否开启:ps -e | grep ssh。如果没有开启:/etc/init.d/ssh start

​ - 2.检查.ssh和其中authorized_key文件的权限,.ssh目录应该为700,authorized_keys需要为600或者644。

​ - 3.检查/etc/ssh/sshd_config文件中有关设置。需要将StrictModes设置为no。

- 配置完之后**一定要重启ssh服务**:`service ssh restart`

3、Hello world

  • 在一个节点上创建helloworld目录,其中C语言程序代码如下:
 1#include <mpi.h>
 2#include <stdio.h>
 3#include <math.h>
 4int main (int argc, char **argv)
 5{
 6	int myid, numprocs;
 7	int namelen;
 8	char processor_name[MPI_MAX_PROCESSOR_NAME];MPI_Init (&argc, &argv);
 9	MPI_Comm_rank (MPI_COMM_WORLD, &myid);
10	MPI_Comm_size (MPI_COMM_WORLD, &numprocs);
11	MPI_Get_processor_name (processor_name, &namelen);
12	fprintf (stderr, "Hello World! Process %d of %d on %s\n", myid, numprocs, processor_name);
13	MPI_Finalize ();
14	return 0;
15}
  • 需要在其中一台节点上该目录中建立host文件列出三个节点的ip。Container中可以使用hostname -I来获取ip地址。
1touch host
2vi host
3然后依次填入ip
  • 编译运行,三个节点都需要有编译后的文件
1mpicc hello.c -o hello
2mpirun -n 16 -hostfile host –allow-run-as-root ./hello

相关网站

教程:https://hpc-tutorials.llnl.gov/mpi/

The Supercomputing Blog:http://supercomputingblog.com/mpi/

comments powered by Disqus