并行程序设计基础——Hello world

news2024/9/28 5:29:16

目录

一、Fortran 90 +MPI实现

二、C++ +MPI实现

三、MPI程序的一些惯例

四、小结


        相信许多编程初学者的入门程序都是“Hello World”,我们同样来编写MPI的第一个程序“Hello World”。

一、Fortran 90 +MPI实现

        我们先给出代码,然后进行代码分析。

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

        代码解析:

        ①首先要包含MPI相对于Fortran实现的头文件mpif.h,这与MPI相当于C语言的实现是不同的。现在MPI的实现已经支持Fortran 90+MPI,在MPI-2中明确了对Fortran 90和C++的支持。如果是Fortran 90程序,则需要将“include mpif.h”改为“use mpi”,也就是说MPI被定义为一个Fortran 90 调用的模块。

        ②定义程序中所需要的与MPI有关的变量。MPI_PROCESSOR_NAME是MPI预定义的宏,即某一MPI的具体实现中允许机器名字的最大长度,机器名存放在变量processor_name中。整型变量myid和numprocs分别用来存储某一并行执行的进程的标识和所有参加计算的进程的个数。namelen是实际得到的机器名字的长度。rc和ierr分别用来得到MPI过程调用结束后返回结果和可能出现的错误信息。

        ③MPI程序的开始和结束必须是MPI_INIT和MPI_FINALIZE,分别完成MPI程序的初始化和结束工作。

        ④MPI程序的主体,包括MPI过程调用语句和Fortran语句。MPI_COMM_RANK得到当前正在运行的进程标识号,存放在变量myid中。MPI_COMM_SIZE得到所有参加计算的进程的个数,存放在变量numprocs中。MPI_GET_PROCESSOR_NAME得到运行本进程的机器名称,存放在变量processor_name中,是一个字符串,长度存放在namelen中。write语句是普通的Fortran语句,将本进程的标识号、进程个数、运行进程的机器名字打印出来,和一般的Fortran程序不同的是这些程序体中的执行语句是并行执行的,每一个参与的进程都要执行。

        程序编译采用mpif90编译器,方式如下:

mpif90 test1.f90 -o test1

        执行命令为:

mpirun -np 4 ./test1

        执行结果为:

        这里采用4个进程并行执行Hello world程序,4个进程都运行在同一台机器上,标识号分别为0、1、2、3,每个进程都执行一次程序,所以最终的执行结果有四条打印语句。

        执行流程如下:

二、C++ +MPI实现

         代码如下:

#include "mpi.h"
#include <stdio.h>
#include <math.h>

int main(int argc, char *argv[])
{
    int myid, numprocs, 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);

    printf("Hello World! Process %d of %d on %s.\n", myid, numprocs, processor_name);

    MPI_Finalize();

    return 0;
}

        C++  + MPI并行程序结构和Fortran 90 + MPI的完全相同,只是在接口调用上的形式和语法有所区别。

        代码解析:

        ①首先要包含MPI头文件'mpi.h',而不是‘mpif.h’。

        ②定义程序中与MPI有关的变量。这里和Fortran 90程序中定义的变量含义相同。

        ③MPI开始和结束的语句是MPI_Init和MPI_Finalize。对比Fortran程序,这两个函数调用时的参数不同,习惯上,Fortran 90中所有MPI调用均为大写(Fortran程序对大小写无关),在C++中是以“MPI_”开头,后面部分的第一个字母大写,其后续部分为小写。

        程序编译采用mpicxx编译器,方式如下:

mpicxx test1.cpp -o test1_cxx

        执行命令为:

mpirun -np 4 ./test1_cxx

        执行结果为:

         从上面的两个例子可知,一个MPI程序的框架结构大概为:

三、MPI程序的一些惯例

        Fortran程序中的MPI调用一般全为大写,C/C++程序中的MPI调用为MPI_Aaaa_aaaa的形式。所有MPI的Fortran子程序在最后参数中都有一个返回代码,对于成功,返回的是MPI_SUCCESS,其它的错误代码是依赖于实现的。一些MPI操作是函数,没有返回代码参数。

        Fortran中的句柄以整型表示,二值变量是逻辑类型。Fortran的数组下标是从1开始,C/C++是从0开始。

四、小结

        从上述介绍和两个例子可知,MPI是在原来的串行程序上进行扩展,其许多地方和串行程序是相同的。串行程序设计的许多经验也是可以应用到并行程序设计中,但是在设计并行程序时,我们需要时刻明确程序并行执行的概念,而不是原来有序的串行执行,这是串行和并行的最主要区别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1988550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础入门汇编语言(第四版王爽)~第1章基础知识

文章目录 前言1.1 机器语言1.2 汇编语言的产生1.3 汇编语言的组成1.4 存储器1.5 指令和数据1.6 存储单元1.7 CPU对存储器的读写1.8 地址总线1.9 数据总线1.10 控制总线1.1~1.10小结检测点1.11.11 内存地址空间概述1.12 主板1.13接口卡1.14 各类存储器芯片1.15 内存地址空间 前言…

9.C基础_指针与数组

数组指针&#xff08;一维数组&#xff09; 数组指针就是" 数组的指针 "&#xff0c;它是一个指向数组首地址的指针变量。 1、数组名的含义 对于一维数组&#xff0c;数组名就是一个指针&#xff0c;指向数组的首地址。 基于如下代码进行分析&#xff1a; int a…

el-form-item,label在上方显示,输入框在下方展示

本来是两排展示去写&#xff0c;设计要求一排展示&#xff0c;label再上方&#xff0c;输入框、勾选框在下方&#xff1b;只能调整样式去修改&#xff1b;参考label-position这个属性 代码如下&#xff1a; <el-form ref"form" :model"formData" clas…

【好书推荐-第二十期】《程序员进阶之路:缓存、网络、内存与案例》:讲解计算机系统中的核心知识分享实际工作中的技术难题及解决方案

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公众号&#xff1a;洲与AI。 &#x1f388; 本文专栏&#xff1a;本文收录…

认识Creator热更新

Creator热更新 1、什么是热更新 当你下载一个游戏&#xff0c;比如王者荣耀&#xff0c;打开时发现提示有新的资源包要让你更新&#xff0c;那就是使用了热更新。 热更新主要是用于原生环境的andriod和ios&#xff0c;对于小游戏不用&#xff0c;小游戏是审核过后&#xff0c…

同声传译用什么软件?亲测好用的同传翻译器分享

巴黎奥运会的到来&#xff0c;让全球的目光再次聚焦于这座浪漫之都。作为国际盛事&#xff0c;语言沟通无疑成为连接各国运动员、观众与媒体的桥梁。 面对多语言环境的挑战&#xff0c;一款高效、准确的同声传译软件显得尤为重要。它不仅能即时传递赛场激情&#xff0c;还能让…

加密软件有什么功能

加密软件是一种用于保护数据安全的工具&#xff0c;它通过对数据进行加密处理&#xff0c;使得未经授权的用户无法访问或篡改这些数据。加密软件使用各种加密算法&#xff0c;如对称加密、非对称加密等&#xff0c;确保数据在传输和存储过程中的安全性。 一、加密软件的功能 数…

【leetcode】相同的树、另一棵树的子树、翻转二叉树(利用深度优先遍历)

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;数据结构、LeetCode专栏 &#x1f4da;本系…

【mars3d】LayerType 的arcgis_feature类型的图层配置聚合属性,达到聚合效果

相关api文档&#xff1a; Global - V3.7.23 - Mars3D API文档 Global - V3.7.23 - Mars3D API文档 ArcGisWfsLayer - V3.7.23 - Mars3D API文档 实现代码&#xff1a; export function onMounted(mapInstance) {map mapInstance // 记录首次创建的map// 添加参考三维模型co…

html+css+js网页设计原神8个页面带js

htmlcssjs网页设计原神8个页面带js 有轮播图&#xff0c;一键置顶等多种效果 网页作品代码简单&#xff0c;可使用任意HTML编辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操…

​​​​​​​ 《大学新生编程入门指南:从新手到大神的蜕变之路》

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…

PD暗电流的测试小技巧

随着新基建概念的提出&#xff0c;5G和数据中心的建设在2020年进入快车道&#xff0c;海量的光模块需求引领着行业的更新换代&#xff0c;对光器件提出了更高的要求。在光通信测试领域&#xff0c;也将迎来很多挑战。 共同面对未来挑战&#xff0c;泰克将推出一系列关于光通信…

计算机网络复习总结

第一章 计算机网络体系结构 1、计算机网络的概念组成和功能 &#xff08;1&#xff09;什么是计算机网络&#xff1f; 计算机网络是将一个分散的、具有独立功能的计算机系统&#xff0c;通过通信设备与线路连接起来&#xff0c;由功能完善的软件实现资源共享和信息传递的系统。…

网页离线缓存 Service Worke

随着 Web 技术的飞速发展&#xff0c;用户对网站的要求越来越高&#xff0c;为了达到用户期望&#xff0c;开发者使出了浑身解数来做性能优化&#xff0c;包括 CDN 内容分发、图片合并、资源文件压缩、异步加载等等手段&#xff0c;这些手段绝大部分都是在干一件事情&#xff0…

真人拍摄,还是技术生成?会走路的数字人物到底是谁?

近日&#xff0c;一段数字人视频引发了全网热议&#xff0c;画面中&#xff0c;一个外观与真人无异的女子在说话的同时缓缓走动。这也让不少网友质疑&#xff0c;视频中所出现的会走路的数字人物并非是由技术生成&#xff0c;而是真人拍摄。“数字人不都是固定不动的吗&#xf…

【Linux学习】文件系统 - 揭秘磁盘存储结构与存储原理

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 &#x1f351;磁盘文件管理&#x1f680;磁盘的机械构成&#x1f30c;磁盘的物理存储&#x1f351;存储原理&#x1f4d5;磁盘的逻辑…

XML 发票解析

文章目录 1. xml 类型发票格式2. 数据提取思路2.1 项目结构 3. 提取实现3.1 实体类3.2 提取工具类3.3 controller3.4 service 4. 结果展示 1. xml 类型发票格式 本文解析的xml类型的发票格式如下 2. 数据提取思路 通过遍历xml文件中的标签去获得标签对应的文本 2.1 项目结…

MySQL的简单介绍

文章目录 数据库关系型数据库非关系型数据”数据库的概念和用途MySQL数据库服务器、数据库和表的关系数据库的创建和删除表创建表修改常见的数据类型和约束字符串类型日期和时间类型PRIMARY KEY使用AUTO_INCREMENT使用UNIQUE使用FOREIGN KEY使用 SQL语言基础SQL语言简介SQL分类…

基于Spark的豆瓣书籍推荐系统的设计与实现-计算机毕业设计源码53447

摘要 本论文主要论述了如何基于Spark开发一个豆瓣书籍推荐系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将论述豆瓣书籍推荐系统的当前背景以及系统开发的目的&#xff0c;后续章节将严…

谷粒商城实战笔记-MySQL踩坑记录

文章目录 1&#xff0c; Public Key Retrieval is not allowed问题描述解决办法 2&#xff0c;1044 -Access denied for user root% to database解决方案 1&#xff0c; Public Key Retrieval is not allowed 问题描述 打开DBeaver连接MySQL提示“Public Key Retrieval is no…