MPI常用接口笔记

MPI并行编程——多进程程序设计 MPI(Massage Passing Interface)不是一种语言,是消息传递函数库的标准规范。MPI标准定义了一组具有可移植性的编程接口,在Fortran和C/C++中可以直接对相应的函数进行调用。本文对MPI消息的发送和接收作简要介绍。并且以PI的计算(使用C/C++编写)等几个程序作为示例。 阅读详情

MPI常用接口

最近在学mpi程序设计,经常要用的mpi的接口函数,故整理如下:

MPI_Init()
  int MPI_Init(
      int* argc_p           /* in/out */,
      char *** argv_p       /* in/out */);

该函数告知MPI系统进行必要的初始化设置,参数argc_p和argv_p分别是指向argc和argv的指针,可以直接设置为NULL;返回值为int型错误码,大多数情况下可以忽略这些错误码。在调用MPI_Init()之前,不应该调用其他MPI函数。

MPI_Finalize()
  int MPI_Finalize(void);

该函数告诉MPI系统MPI已经使用完,可以释放所有为MPI分配的资源了。在该函数之后,不应再调用MPI函数。

MPI_Comm_size()
  int MPI_Comm_size(
    MPI_Comm comm       /* in */,
    int* comm_sz        /* out */);

该函数获取给定通信子中线程的数目,comm传入给定通信子,comm_sz传出线程数目。

MPI_Comm_rank()
  int MPI_Comm_rank(
    MPI_Comm comm       /* in */,
    int* my_rank        /* out */);

该函数获取给定通信子中该进程的进程号,comm传入给定通信子,my_rank传出进程号。

MPI_Send()
  int MPI_Send(
    void* msg_buffer_p      /* in */,
    int msg_size            /* in */,
    MPI_Datatype msg_type   /* in */,
    int dest                /* in */,
    int tag                 /* in */,
    MPI_Comm comm           /* in */);

该函数在进程间发送消息。msg_buffer_p是一个指向包含消息内容的内存块的指针;msg_size表示数据长度;msg_type表示数据类型;dst表示目的进程号;tag是个非负int型,标签,同一标签才能被接受;comm是通信子,所有涉及通信的MPI函数都有通信子参数。

该函数有两种可能性:

  • 缓冲消息,当消息长度小于系统的截止长度,MPI系统会将消息放置在它自己的内部存储器,并返回MPI_Send的调用
  • 阻塞,当消息长度大于系统的截止长度时,该进程陷入阻塞,将一直等待,直到可以开始发送消息,并不立即返回MPI_Send的调用。
    数据类型如下:
MPI 数据类型C语言数据类型MPI数据类型C语言数据类型
MPI_CHARsigned charMPI_UNSIGNEDunsigned int
MPI_SHORTsigned short intMPI_UNSIGNED_LONGunsigned long int
MPI_INTsigned intMPI_FLOATfloat
MPI_LONGsigned long intMPI_DOUBLEdouble
MPI_LONG_LONGsigned long long intMPI_LONG_DOUBLElong double
MPI_UNSIGNED_CHARunsigned charMPI_BYTE
MPI_UNSIGNED_SHORTunsigned short intMPI_PACKED
MPI_Recv()
  int MPI_Recv(
      void* msg_buffer_p        /* out */,
    int msg_size            /* in */,
    MPI_Datatype msg_type   /* in */,
    int source              /* in */,
    int tag                 /* in */,
    MPI_Comm comm           /* in */,
    MPI_Status* status_p    /* out */);

该函数在进程间接收消息。该函数的参数与MPI_Send()的参数相似,不同之处在于source为源进程号,status_p在大多数情况下不使用,赋予MPI_STATUS_IGNORE就行。

MPI提供特殊的常量MPI_ANY_SOURCE和MPI_ANY_TAG用来统配所有源进程号和所有标签,但是,只有MPI_Recv()可以使用,MPI_Send()必须制定目的进程号和标签。

该函数总是阻塞的,直到接收到一条匹配消息。

MPI_Get_count()
  int MPI_Get_count(
    MPI_Status* status_p        /* in */,
    MPI_Datatype recv_type      /* in */,
    int* count_p                /* out */);

该函数返回接收到的元素数量。MPI_Status类型是一个至少含有三个成员的结构:MPI_SOURCE、MPI_TAG和MPI_ERROR,可以获得发送者、标签和错误类型。元素数量将存在count_p所指向的空间中。

MPI_Reduce()
  int MPI_Reduce(
    void* input_data_p          /* in */,
    void* output_data_p         /* out */,
    int count                   /* in */,
      MPI_Datatype datatype     /* in */,
      MPI_Op operator               /* in */,
      int dest_process          /* in */,
      MPI_Comm comm             /* in */);

规约函数。input_data_p是源数据的地址,output_data_p是存放目的数据的地址,两者都既可以是标量,也可以是向量;count>1,表示input_data和output_data是向量;operator是规约操作符。

参数output_data_p只用在dest_process上,但是所有进程都需要传递一个与output_data_p相对应的实际参数,即使是NULL.

运算符值含义运算符值含义
MPI_MAX求最大值MPI_LOR逻辑或
MPI_MIN求最小值MPI_BOR按位或
MPI_SUM求累加和MPI_LXOR逻辑异或
MPI_PROD求累乘积MPI_BXOR按位异或
MPI_LAND逻辑与MPI_MAXLOC求最大值和最大值所在位置
MPI_BAND按位与MPI_MINLOC求最小值和最小值所在位置
MPI_Allreduce()
  int MPI_Reduce(
    void* input_data_p          /* in */,
    void* output_data_p         /* out */,
    int count                   /* in */,
      MPI_Datatype datatype     /* in */,
      MPI_Op operator               /* in */,
      MPI_Comm comm             /* in */);

全局规约函数,规约结果会保存在所有进程中。

MPI_Bcast()
  int MPI_Bcast(
    void* data_p                /* in/out */,
    int count                   /* in */,
    MPI_Datatype datatype       /* in */,
    int source_process          /* in */,
    MPI_Comm comm               /* in */);

该函数用于广播。在一个集合通信中,如果属于同一个进程的数据被发送到通信子中的所有进程,这样的集合通信被称为广播。source_process进程中data_p指向的数据将会存在该通信子中所有进程的data_p指向的空间中。

MPI_Scatter()
  int MPI_Scatter(
    void* send_buffer_p         /* in */,
    int send_count              /* in */,
    MPI_Datatype send_type      /* in */,
    void* recev_buffer_p        /* out */,
    int recev_count             /* in */,
    MPI_Datatype recev_type     /* in */,
    int source_process          /* in */,
    MPI_Comm comm               /* in */);

散射函数,用于分发数据,该函数将send_buffer_p所引用的数据分为comm_sz份,第一份给0号进程,第二份给1号进程,以此类推。send_count表示发送给每个进程的数据量。

MPI_Gather()
  int MPI_Gather(
    void* send_buffer_p         /* in */,
    int send_count              /* in */,
    MPI_Datatype send_type      /* in */,
    void* recev_buffer_p        /* out */,
    int recev_count             /* in */,
    MPI_Datatype recev_type     /* in */,
    int dest_process            /* in */,
    MPI_Comm comm               /* in */);

聚集函数。0号进程中,由send_buffer_p所引用的内存区的数据存储在recev_buffer_p的第一个块中;1号进程中,由send_buffer_p所引用的内存区的数据存储在recev_buffer_p的第二个块中;一次类推。recev_count表示接收到每个进程的数据量,而不是所有数据量的总和。

MPI_Gather()和MPI_Scatter()有如下限制:数据使用块划分法,且每个块大小相同。

MPI_Allgather()
  int MPI_AllGather(
    void* send_buffer_p         /* in */,
    int send_count              /* in */,
    MPI_Datatype send_type      /* in */,
    void* recev_buffer_p        /* out */,
    int recev_count             /* in */,
    MPI_Datatype recev_type     /* in */,
    MPI_Comm comm               /* in */);

全局聚集函数,该函数将所有进程的send_buffer_p内容串联起来,存储在每个进程的recev_buffer_p参数中。

MPI_Wtime()
  double MPI_Wtime(void);

返回从某一特定时刻开始所经过的秒数。

MPI最基本函数整理 MPI最基本函数整理 MPI-1共有128个调用接口,MPI-2共有287个调用接口。整体上MPI是非常庞大的,但是,从理论上说,MPI所有的通信功能可以用它的最基本的6个调用来实现。 int MPI_Init(int *argc, char ***argv) 功能:MPI_Init是MPI程序的第一个调用,完成MPI程序初始化工作,通过获取main函数的参数,让每一个MPI进程都能获取到mai... 阅读详情

相关推荐

【MPI】 六大金刚:六个最基本、最常用的函数

首先,安装MPI看。先简要介绍一下rank(进程序号)和。

jokerMingge的博客 2294

04-MPI几个基本函数

1、MPI程序基本结构 注意,所有的MPI标识符,包括函数标识符,都以MPI前缀开头,后面紧跟一个大写字母和一系列小写字母以及下划线。所有的MPI常数都是以MPI开头的大写字母和下划线的字符串。 2、MPI原始数据类型 3、MPI基本函数 MPI_Init int MPI_Init(int*argc, char *argv[]) 每一个被MPI程序调用的第一个MPI函数都是......

Sunshine8430的博客 1万+

并行程序设计基础——MPI常用接口介绍

通过一个消息收发例子介绍了MPI最重要的6个接口信息以及使用方法

欢迎各位大佬光临“寒舍”!请多多指点,共同进步! 1404

MPI总结

一、MPI的四个基本函数 1、MPI_InitMPI_Init:初始化MPI执行环境。 在MPI_Init函数中,并不一定都需要设置argc_p和argv_p这两个参数的,不需要的时候,将它们设置为NULL即可 MPI_Init( int* argc_p, char*** argv_p );他们的第一个参数都传入通信子作为参数,第二参数都用传出参数分别把正在调用通信子

sinat_22336563的博客 2963

MPI常用函数总结

目录 1、MPI基本函数 2、点对点通信函数 3、集体通信函数 1、MPI基本函数 #include <stdio.h> #include "mpi.h" int main(int argc, char** argv){ int rank,size; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_CO...

Wqxleo 3669

MPI常用函数

常用的MPI函数 MPI_INIT(int *argc,char ***argv)和MPI_Finalize() MPI_Init:初始化MPI执行环境 MPI_Finalize:结束MPI执行环境 这两个函数定义MPI程序的并行区,所有MPI函数在这两个函数定义的区域内调用。这两个函数都返回整型值,标识函数是否调用成功。 MPI_COMM_RANK(MPI_COMM_WORLD, &a...

weixin_44537584的博客 4400

笔记——MPI简介

什么是MPI 1、MPI是一个库,而不是一门语言。 2、MPI是一种标准或规范的代表,而不特指某一个对它的具体实现。 3、MPI是一种消息传递编程模型,并成为这种编程模型的代表和事实上的标准。MPI虽然很庞大。但是它的最终目的是服务于进程间通信这一目标的。 目前主要的MPI实现 实现名称 研制单位 网址 Mpich Argonne and MSU http://www-unix.mcs.anl.gov/mpi/mpich Chimp Edinburgh ftp://ftp.epcc.ed

weixin_43850810的博客 1万+

MPI 学习笔记

message passing model the Message Passing Interface (MPI) - standard interface MPI is only a definition for an interface 几个重要的概念 communicator: 由一系列进程组成,拥有沟通的能力 每个进程都有 rank 沟通交流靠秩 + tag(标记信息) point-to-p

bigzhao_25的博客 1万+

MPI 常用函数概述

MPICH 的 manpages 需要在线查看,或者在 Linux 系统中用 man 查看,不方便。这里我做了一些对常用函数的总结。 基本结构 参考:http://mpitutorial.com/tutorials/mpi-hello-world/zh_cn/ #include &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;mpi.h&amp;amp;amp;amp;amp;amp;amp;amp;

哈罗德Android笔记 6693

【C语言】【MPI】MPI编程入门详解

【C语言】【MPI】MPI编程入门详解 MPI简介 说到并行计算,我们有一个不可绕开的话题——MPI编程。MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。与OpenMP并行程序不同,MPI是一种基于信息传递的并行编程技术。消息传递接口是一种编程接口标准,而不是一种具体的编程语言。简而言之,MPI标准定义了一组具有可

qq_43331089的博客 5779

MPI学习笔记

MPI Notes 开头要注明 #include 以引入MPI函数库。   MPI_Comm_size: 进程个数 MPI_Comm_rank: 进程ID,从0到size-1。   HelloWorld(MPI) #include “mpi.h” #include   int main(int argc, char *argv[]) {          intrank

┅☆心随风飞 3399

MPI编程入门详解

MPI简介 说到并行计算,我们有一个不可绕开的话题——MPI编程。MPI是一个跨语言的通讯协议,用于编写并行计算机。支持点对点和广播。MPI是一个信息传递应用程序接口,包括协议和和语义说明,他们指明其如何在各种实现中发挥其特性。MPI的目标是高性能,大规模性,和可移植性。MPI在今天仍为高性能计算的主要模型。与OpenMP并行程序不同,MPI是一种基于信息传递的并行编程技术。消息传递接口是一种编...

weixin_36670529的博客 1万+

MPI笔记

MPI笔记Leoeon 2014.07.30MPI笔记 基本框架 点对点通信 1 阻塞型通信函数 2 缓冲通信 3 非阻塞通信 4 持久通信 集合通信 1 阻塞 2 广播 3 汇总与散射 4 汇总与散射 5 归约操作 派生数据类型 1 派生类型 2 打包 进程组与通信子 1 进程组 2 通信子 3 结合 辅助拓扑 1 笛卡尔拓扑 2 无向图拓扑 其他 1 编译与运行 2 IO处理 3 空对象1 基

Leoeon的博客 1623

MPI简单入门学习笔记

MPI新手入门 学习笔记

m0_55063425的博客 3433

MPI学习笔记——点对点通信

一对进程之间的数据转换,也就是说一边发送数据另一边接收数据,点到点通信是MPI通信机制的基础,它分为同步通信和异步通信二种机制。 阻塞式函数 1.       int MPI_send(void *buf,int count,MPI_Datatype datatype,int dest,int tag,MPI_Comm comm) IN      buf      所要发送消息数据的首地址

rommel1的专栏 2万+

Fluent动网格+滑移网格+重叠网格对比介绍(以震荡水翼flapping foil为例)

初学fluent笔记,本文主要包含: Flapping foil在fluent内的几种实现方式 在哪设置动网格、滑移、重叠网格 flapping的UDF 示例 写在前面:Fluent在预览网格运动/提交计算之前,注意保存一个cas版本。 -------------------------Flapping foil 网格几种组合实现方式:---------------------- 直接重叠网格,overset, 需要建立两个几何part,part要重合。水翼局部区域(component),背景网格(ba

深海民工CFDer 2万+

MPI 入门

MPI代表Message Passing Interface(消息传递接口),是一种用于在并行计算中进行通信的标准。MPI是一组库和规范,允许多个处理单元(通常是计算集群或超级计算机中的节点)在并行执行的程序之间进行通信和数据传输。​ MPI的主要目标是提供一个标准的、可移植的编程接口,使得开发者能够方便地编写并行程序,而不用担心底层硬件和通信机制的细节。MPI支持点对点通信和集体通信,使得并行程序可以在不同的处理单元之间交换信息,协同完成任务。**并行计算 ****标准化接口 **

qq_57862276的博客 1161

在Qt中集成VTK和PCL:实现数据可视化的完整指南

在现代软件开发中,数据可视化至关重要。将VTK(Visualization Toolkit)和PCL(Point Cloud Library)集成到Qt环境里,能为开发者提供强大的可视化解决方案。本文将深入讲解如何在Qt中读取PCL文件,展示VTK模型和PCL数据,适合想要在Qt项目中实现数据可视化的开发者。

轩宇的博客 917

MPI之MPI_Send&MPI_Recv阻塞接口及参数详解

MPI_Recv 函数是 MPI 标准中的一个阻塞函数,它将一直阻塞直到接收到来自指定源和标记的消息。返回值:函数执行成功,返回 MPI_SUCCESS。如果发生错误,则返回相应的错误码。返回值:函数执行成功,返回 MPI_SUCCESS。如果发生错误,则返回相应的错误码。

KingOfMyHeart的博客 4068

【AUTOSAR-COM】-10.5-APP CAN Frame/PDU“发送周期不准“的影响因素

一个Tx PDU在COM模块中的数据流; Tx APP CAN Frame/PDU"发送周期不准"的影响因素;

「汽车电子助手」的博客 2386

BoT-SORT实战:手把手教你实现BoT-SORT训练和测试

文章目录摘要1、数据准备2、配置BoT-SORT环境2.1、获取代码2.2、创建虚拟环境2.3、安装必要的包2.3.1、安装pytorch2.3.2、安装cython2.3.3、安装Cython-bbox2.3.4、安装faiss2.3.5、安装其他的包3、训练3.1、生成REID数据集3.2、预训练模型3.2.1、ByteTrack预训练模型3.2.2、REID预训练模型3.3、开始训练4、如何更改FASTREID的BackBone?5、测试5.1、测试视频5.2、测试摄像头5.3、多类别测试 摘要 Bo

m0_47867638的博客 2298

MPI编程的常用接口速查

获取当前时间 在插入MPI提供的头文件后,可以获得获取时间的函数。 double MPI_Wtime(void) 取得当前时间, 计时的精度由 double MPI_Wtick(void) 取得作为对比,一般在C/C++中, 插入time.h,通过 clock_t clock(void) 取得当前时间, 计时的精度由常数 CLOCKS_PER_SEC 定义。 点到点通...

305

【GameFramework框架内置模块】8、文件系统(File System)

最近好忙,鸽了好久。不能颓废了,继续发力。今天分享的是GF框架的文件系统。首先,引用比较官方的说法:GF的FileSystem虚拟文件系统,使用类似磁盘存储的感念对零散的文件进行集中管理,优化资源加载时产生的内存分配,也可以对资源进行局部片段加载,极大的提升了资源加载的性能。通俗点讲就是,我这个模块就是加载磁盘文件的,优化加载时产生的内存分配。那么,它是怎么优化的呢?

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 2452
上一篇: Mininet基础笔记
下一篇: mpi my_rank全为0而comm_sz全为1的解决办法
Hey___Man
博客等级 码龄9年 16粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值