本文主要是介绍MPI并行程序设计 —— C 和 fortran 环境搭建 openmpi 示例程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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:$PATHexport LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hipper/ex_openmpi/local/libcd examplesmakempirun -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 maininclude 'mpif.h'character * (MPI_MAX_PROCESSOR_NAME) processor_nameinteger myid, numprocs, namelen, rc,ierrcall 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
效果图:
3.3 机器名称最长可以占多少个字节
256个字节
效果:
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
效果图:
这篇关于MPI并行程序设计 —— C 和 fortran 环境搭建 openmpi 示例程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!