1.安装环境
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.6.tar.g
tar zxf openmpi-4.1.6.tar.gz
cd openmpi-4.1.6/
其中 configure 选项 --prefix=/.../ 需要使用绝对路径,例如:
./configure --prefix=/home/hipper/ex_openmpi/local/ 2>&1 | tee config.out
make -j all 2>&1 | tee make.out
make install 2>&1 | tee install.out
2.配置编译运行环境
export PATH=/home/hipper/ex_openmpi/local/bin:$PATH
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hipper/ex_openmpi/local/lib
cd examples
make
mpirun -np 7 hello_c
效果图:
3. 练习测试环境
3.1 C语言测试
#include "mpi.h"
#include <stdio.h>
#include <math.h>
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 on %s\n",
myid, numprocs, processor_name);
MPI_Finalize();
}
编译:
gcc hello_ompi.c -I ../local/include/ -L ../local/lib/ -lmpi
执行:
../local/bin/mpirun -np 18 ./a.out
cpu有18个物理核心
效果:
3.2 fortran 语言测试
源代码:每行开始TAB键
program main
include 'mpif.h'
character * (MPI_MAX_PROCESSOR_NAME) processor_name
integer myid, numprocs, namelen, rc,ierr
call MPI_INIT( ierr )
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
call MPI_GET_PROCESSOR_NAME(processor_name, namelen, ierr)
write(*,10) myid,numprocs,processor_name
10 FORMAT('Hello World! Process ',I2,' of ',I1,' on ', 20A)
call MPI_FINALIZE(rc)
end
编译:
gfortran hello_ompi.f -I../local/include/ -L../local/lib/ -lmpi_mpifh -lgfortran
运行:
$ ../local/bin/mpirun -np 7 ./a.out
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/33de6bb0d88ce02fa4a2be2ea1626dfc.png)
3.3 机器名称最长可以占多少个字节
256个字节
效果:
![](https://i-blog.csdnimg.cn/blog_migrate/64158f9fa60c97e62870fc56a85bfad6.png)
3.4 进程间收发信息
#include "mpi.h"
main( argc, argv )
int argc;
char **argv;
{
MPI_Status status;
char message[20];
int myrank;
MPI_Init( &argc, &argv );
/* MPI程序的初始化*/
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
/* 得到当前进程的标识*/
if (myrank == 0) /* 若是 0 进程*/
{
/* 先将字符串拷贝到发送缓冲区message中 然后调用MPI_Send语句将它发出 用 strlen(message)指定消息的长度 用MPI_CHAR指定消息的数据类型 1指明发往进程1 使用的消息标识是99 MPI_COMM_WORLD是包含本进程 进程0 和接收消息的进程 进 程1 的通信域 发送方和接收方必须在同一个通信域中 由通信域来统一协调和控制消息 的发送和接收*/
strcpy(message,"Hello, process 1\n");
MPI_Send(message, strlen(message), MPI_CHAR, 1, 99,MPI_COMM_WORLD);
}
else if(myrank==1) /* 若是进程 1 */
{
/*进程1直接执行接收消息的操作 这里它使用message作为接收缓冲区 由此可见 对于同 一个变量 在发送进程和接收进程中的作用是不同的 它指定接收消息的最大长度为20 消 息的数据类型为MPI_CHAR字符型 接收的消息来自进程0 而接收消息携带的标识必须为 99 使用的通信域也是MPI_COMM_WORLD 接收完成后的各种状态信息存放在status中 接收完成后 它直接将接收到的字符串打印在屏幕上 */
MPI_Recv(message, 20, MPI_CHAR, 0, 99, MPI_COMM_WORLD, &status);
printf("received :%s:", message);
}
MPI_Finalize();
/* MPI程序结束*/
}
编译:
$ gcc send_recv_openmpi.c -o send_recv.out -I ../local/include/ -L ../local/lib -lmpi
运行:
$ ../local/bin/mpirun -np 2 ./send_recv.out
效果图:
![](https://i-blog.csdnimg.cn/blog_migrate/c8ce45ec53c3976750edd3689fb29a57.png)