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:$PATH
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/hipper/ex_openmpi/local/lib
 
 cd examples
 make
 mpirun -np 7 hello_c

效果图:

MPI并行程序设计 —— C 和 fortran 环境搭建 openmpi 示例程序_第1张图片

3. 练习测试环境

3.1 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 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个物理核心

效果:

MPI并行程序设计 —— C 和 fortran 环境搭建 openmpi 示例程序_第2张图片

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

效果图:

MPI并行程序设计 —— C 和 fortran 环境搭建 openmpi 示例程序_第3张图片

3.3 机器名称最长可以占多少个字节

256个字节
效果:
MPI并行程序设计 —— C 和 fortran 环境搭建 openmpi 示例程序_第4张图片

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

效果图:

你可能感兴趣的:(hpc,高性能计算,并行计算)