MPI并行程序设计 —— C 和 fortran 环境搭建 openmpi 示例程序

2023-12-30 13:52

本文主要是介绍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 示例程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/553043

相关文章

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

MySQL设置密码复杂度策略的完整步骤(附代码示例)

《MySQL设置密码复杂度策略的完整步骤(附代码示例)》MySQL密码策略还可能包括密码复杂度的检查,如是否要求密码包含大写字母、小写字母、数字和特殊字符等,:本文主要介绍MySQL设置密码复杂度... 目录前言1. 使用 validate_password 插件1.1 启用 validate_passwo

springboot整合mqtt的步骤示例详解

《springboot整合mqtt的步骤示例详解》MQTT(MessageQueuingTelemetryTransport)是一种轻量级的消息传输协议,适用于物联网设备之间的通信,本文介绍Sprin... 目录1、引入依赖包2、yml配置3、创建配置4、自定义注解6、使用示例使用场景:mqtt可用于消息发

Go中select多路复用的实现示例

《Go中select多路复用的实现示例》Go的select用于多通道通信,实现多路复用,支持随机选择、超时控制及非阻塞操作,建议合理使用以避免协程泄漏和死循环,感兴趣的可以了解一下... 目录一、什么是select基本语法:二、select 使用示例示例1:监听多个通道输入三、select的特性四、使用se

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

MySQL实现多源复制的示例代码

《MySQL实现多源复制的示例代码》MySQL的多源复制允许一个从服务器从多个主服务器复制数据,这在需要将多个数据源汇聚到一个数据库实例时非常有用,下面就来详细的介绍一下,感兴趣的可以了解一下... 目录一、多源复制原理二、多源复制配置步骤2.1 主服务器配置Master1配置Master2配置2.2 从服

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

Python中的sort()和sorted()用法示例解析

《Python中的sort()和sorted()用法示例解析》本文给大家介绍Python中list.sort()和sorted()的使用区别,详细介绍其参数功能及Timsort排序算法特性,涵盖自适应... 目录一、list.sort()参数说明常用内置函数基本用法示例自定义函数示例lambda表达式示例o