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

效果图:

相关推荐
joker D88819 天前
【CUDA】CUDA Hierarchy
linux·cuda·c/c++·并行计算
高性能服务器24 天前
COMSOL工作站:配置指南与性能优化
数字孪生·ansys·高性能计算·openfoam·comsol·仿真软件·声学仿真
安洛81 个月前
高性能计算-探究循环分块优化cache miss(13)(接2-1)
高性能计算·程序优化·循环优化·循环分块
高性能服务器1 个月前
马斯克万卡集群AI数据中心引发的科技涟漪:智算数据中心挑战与机遇的全景洞察
数据中心·hpc·高性能计算·智算中心·马斯克ai数据中心·colossus·xai
orlion2 个月前
使用AVX2指令集加速推荐系统MMR层余弦相似度计算
go·高性能计算
青云交3 个月前
大数据新视界 --大数据大厂之基于 MapReduce 的大数据并行计算实践
大数据·搜索引擎·性能优化·mapreduce·并行计算·数据倾斜·电商数据
高性能服务器3 个月前
探索GPU算力在大模型和高性能计算中的无限潜能
算法·语言模型·gpu算力·hpc·高性能计算
Eloudy4 个月前
基于 Householder 变换的 qr 分解 算法与源码实现
算法·hpc
吴bug5 个月前
配置提交节点
hpc·lsf
迪普微社区5 个月前
解锁算力新极限,Xilinx UltraScale+赋能的高性能低延时FPGA加速卡
网络·fpga开发·fpga·芯片·xilinx·高性能计算·加速卡