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

效果图:

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

效果图:

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

效果图:

相关推荐
华为云开发者联盟7 天前
探秘数据库中的并行计算技术应用
mysql·并行计算·华为云开发者联盟
小信瑞13 天前
IBM Spectrum LSF Data Manager,独立于群集工作负载进行数据传输管理,以提高吞吐量并优化计算资源的使用
集群管理·计算资源管理·hpc·高性能计算·工作负载管理·作业调度系统·工作负载迁移
小信瑞23 天前
分布式高性能计算 (HPC)的工作负载管理平台和作业调度程序—— IBM Spectrum® LSF® Suites
分布式·ibm lsf·计算资源管理·hpc·工作负载管理·作业调度系统·作业调度程序
丷从心·2 个月前
【并行计算】【《并行程序设计导论》笔记】第二章:并行硬件和并行软件
并行计算
小信瑞3 个月前
Altair® (澳汰尔)Grid Engine® 分布式资源管理系统
分布式·自动化·资源管理·高性能计算·澳汰尔·altair·资源管理系统
whyte王3 个月前
CUDA 12.4文档5 编程接口-使用CUDA运行时-初始化&设备内存
gpu·cuda·hpc·高性能计算
lyx_20163 个月前
MacOS安装openMP报错【已解决】
macos·并行计算·openmp
whyte王3 个月前
CUDA 12.4文档2 内核&线程架构
架构·gpu·cuda·hpc
YAFree1233 个月前
Taskflow:请求-取消与 性能分析
c++·算法·并行计算·任务编排·taskflow
小信瑞4 个月前
Altair® RapidMiner®数据分析与人工智能平台
人工智能·ai·数据挖掘·数据分析·仿真·高性能计算