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/