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

这篇具有很好参考价值的文章主要介绍了MPI之MPI_Send&MPI_Recv阻塞接口及参数详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MPI简介以及阻塞非阻塞代码示例

函数原型:

MPI_Send

int MPI_Send(void *buf, int count, MPI_Datatype datatype, 
int dest, int tag, MPI_Comm comm)
  • buf:指向发送缓冲区的指针;
  • count:发出的消息的数量(例如,整数个数、字节数等);
  • datatype:发出消息的数据类型。MPI 数据类型通常是针对特定的数据结构(如 char、int、float 等)定义的,它仅能在使用相同 MPI_Datatype 的进程间传递数据;
  • dest:目标进程的标识符(MPI_Comm 值)。该参数用于指定消息的目标进程,它必须等于 MPI_Init 时返回的进程 ID,或者是调用 MPI_Comm_rank 函数返回的值。
  • tag:消息标记,用于识别消息。每个消息都有一个唯一的标记,接收方可以使用它来过滤出要接收的消息,如果数据发送时指定的tag和数据接受时指定的tag不一致,数据将无法接收
  • comm:MPI 通信器,用于指定通信域。该参数定义了进程组,这些进程可以相互通信;

返回值:函数执行成功,返回 MPI_SUCCESS。如果发生错误,则返回相应的错误码。

MPI_Recv

int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, 
int tag, MPI_Comm comm, MPI_Status *status)
  • buf:接收缓冲区的指针,用于接收从另一个进程中到来的数据。
  • count:接收数据的数量(例如,整数个数、字节数等);
  • datatype:接收数据的数据类型。MPI 数据类型通常是针对特定的数据结构(如 char、int、float 等)定义的,它仅能在使用相同 MPI_Datatype 的进程间传递数据;
  • source:发送消息的源进程的标识符。该参数用于指定发送消息的源进程,它必须等于 MPI_Init 时返回的进程 ID,或者是调用 MPI_Comm_rank 函数返回的值。如果该值等于 MPI_ANY_SOURCE,则表示从任何进程接收消息;
  • tag:消息标记,用于识别消息。每个消息都有一个唯一的标记,接收方可以使用它来过滤出要接收的消息。如果该值等于 MPI_ANY_TAG,则表示接收任何标记的消息;
  • comm:MPI 通信器,用于指定通信域。该参数定义了进程组,这些进程可以相互通信。
  • status:包含接收到的消息的状态信息,包括消息的源、标记和错误信息等。如果不需要这些状态信息,可以传递 MPI_STATUS_IGNORE。

返回值:函数执行成功,返回 MPI_SUCCESS。如果发生错误,则返回相应的错误码。
MPI_Recv 函数是 MPI 标准中的一个阻塞函数,它将一直阻塞直到接收到来自指定源和标记的消息。文章来源地址https://www.toymoban.com/news/detail-681415.html

代码示例:

//0号进程给1号进程发送数据
#include "mpi.h"
#include <unistd.h>
#include <iostream>


int main(int argc, char *argv[])
{
    int err = MPI_Init(&argc,&argv);
    int rank,size;
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    if(0 == rank)
    {
        int sendNum = 99;
        //这里指定消息的标签为0   目标进程的标识符为1
        int tag = 0;
        int dest = 1;
        MPI_Send(&sendNum, 1 ,MPI_INT ,dest , tag , MPI_COMM_WORLD);
    }
    else
    {
        int recvNum = 0;
        //这里指定接收的消息的标签为0   消息源的进程的标识符为1
        //如果这里tag 不等于0,将无法接收到发送进程来的消息
        //如果指定tag为MPI_ANY_TAG,将可以接受源进程发送的任意标签的消息
        //
        int tag = 0;
        int source = 1;
        MPI_Status status;
        std::cout << "before recv , recv num = " << recvNum << std::endl;
        MPI_Recv(&recvNum, 1 ,MPI_INT , source, tag, MPI_COMM_WORLD, &status);
        std::cout << "before recv , recv num = " << recvNum << std::endl;
    }
    
    err = MPI_Finalize();
    return 0;
}

到了这里,关于MPI之MPI_Send&MPI_Recv阻塞接口及参数详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 中 Controller 接口参数注解全攻略与实战案例详解

    在 Spring Boot 应用程序中,Controller 是 MVC 架构模式中的核心组件之一,负责处理 HTTP 请求并返回响应结果。为了更好地映射请求、解析请求参数、执行业务逻辑和生成视图或 JSON 数据,Controller 中广泛使用了各种注解。本文将全面梳理 Spring Boot 中 Controller 接口所使用的各类注

    2024年04月24日
    浏览(39)
  • send()函数的用法;MSG_NOSIGNAL什么含义?有什么作用?以及flags中参数类型有哪些各自又起到什么作用?

    目录  1.send()函数的基本用法(入门级): 2.MSG_NOSIGNAL什么含义?有什么作用? 3.send()函数中第4个flags中参数类型有哪些各自又起到什么作用? send() 函数是一个用于在 TCP/IP 网络上发送数据的系统调用函数。它通常在客户端和服务器端程序中被使用。 send() 函数的语法如下: 其

    2024年02月07日
    浏览(45)
  • 前端请求队列,解决多个请求同时请求一个接口导致阻塞的问题

    最近开发的数据大屏项目,使用echarts图表,通过拖拽的方式完成大屏的布局。 每一个图表编写一个vue文件,例如柱状图(barChart.vue): queryEchartsData的方法体如下: 折线图等其他图表同理,都是使用queryEchartsData来获取后端接口返回的数据,queryEchartsData写在queryData.js中,然后

    2024年01月20日
    浏览(44)
  • 【Postman】Postman接口测试进阶用法详解:断言、全局与环境变量、关联、批量执行用例、读取外部文件实现参数化

    Postman断言使用JavaScript语言编写,写在Postman的【Tests】 标签中。 【Tests】中的脚本在发送请求之后执行,它会把断言的结果(PASS/FAIL)最终在【Test Results】 标签页中。 断言响应状态码是否为200(Status code is 200) 断言响应体JSON数据校验(Response body:JSON value check) 断言响应体

    2024年02月15日
    浏览(60)
  • 【JAVA基础】- 同步非阻塞模式NIO详解

    NIO(Non-Blocking IO)是同步非阻塞方式来处理IO数据。服务器实现模式为一个请求一个线程,即客户端发送的链接请求都会注册到选择器上,选择器轮询到连接有IO请求时才启动一个线程进行处理。 同步(synchronous) :调用方式指应用(Application),调用方发起有一个功能调用时,在

    2024年02月13日
    浏览(43)
  • Java IO:同步阻塞和装饰器模式详解

    大家好,我是chowley, 今天来介绍一下Java IO中的两个重要概念—— 同步阻塞和装饰器模式。 在计算机编程中,同步阻塞(Synchronous Blocking)指的是在进行某个操作时,当前线程会被阻塞(即暂停执行),直到该操作完成才会继续执行。在 Java IO 中,输入输出操作通常是同步阻

    2024年02月21日
    浏览(33)
  • 接口参数在线查询 - 方便快捷的查看接口参数和返回值

    随着互联网的发展,越来越多的企业开始构建自己的API接口。而随着API接口的增多,调用者需要了解API的参数和返回值,这时我们就需要一种方便快捷的查询方式。本文将介绍一种以接口参数在线查询为核心的方式,同时以银行三要素验证接口为例,展示如何实现接口参数在

    2024年02月10日
    浏览(43)
  • MPI安装+CentOs6.5多机环境下MPI并行编程+MPI矩阵并行计算(超详细)

    创建多进程,输出进程号和进程数 运行多进程并行例子程序 编程实现大规模向量/矩阵并行计算 1、在开始安装之前,先检查一下是否已经安装好了相应的编译器。 2、安装MPICH之前,首先要在centos6.5上安装c编译器,(进入超级用户)使用指令安装如下: 3、(返回普通用户)

    2024年02月09日
    浏览(40)
  • postman参数化-将上一个接口的返回作为下一个接口的请求参数

    在使用postman做接口测试的时候,在多个接口的测试中,如果需要上一个接口的返回值作为下一个接口的入参,其基本思路是: 1、获取上一个接口的返回值 2、将返回值设置成环境变量或者全局变量 3、设置下一个接口的参数形式 以 下边接口为例: 一、在Tests里设置环境变

    2024年02月11日
    浏览(46)
  • 【Linux】进程的状态(运行、阻塞、挂起)详解,揭开孤儿进程和僵尸进程的面纱,一篇文章万字讲透!!!!进程的学习②

    目录 1.进程排队 时间片 时间片的分配 结构体内存对齐 偏移量补充 对齐规则  为什么会有对齐 2.操作系统学科层面对进程状态的理解 2.1进程的状态理解 ①我们说所谓的状态就是一个整型变量,是task_struct中的一个整型变量 ②.状态决定了接下来的动作 2.2运行状态 2.3 阻塞状

    2024年04月14日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包