MPI之持久化通信句柄与非持久化通信句柄

news2024/12/23 17:36:26

MPI_Isend & MPI_Send 创建临时通信句柄

在前面的文章中举了例子,我们使用MPI_Isend接口发送数据时,有个传出参数request,该参数是创建的通信句柄,
实际上该句柄是一个临时句柄,即只用于一次性发送数据的场景,如不能在循环体中多次使用:

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);
    int data = 100;
    //将在发送进程的MPI_Isend创建初始化,数据接收进程中使用该句柄
    MPI_Request request;
    MPI_Status status;

    if(rank > 0)
    {   
        MPI_Irecv(&data,1,MPI_INT,rank-1,0,MPI_COMM_WORLD,&request);
        std::cout << "rank = " << rank << " recived data is :  " << data << std::endl;
        MPI_Wait(&request, &status);
        std::cout << "rank = " << rank << " recived data is :  " << data << std::endl;
    }
    if(rank < size - 1)
    {
        data = rank;
        MPI_Isend(&data,1,MPI_INT, (rank + 1)%size, 0 ,MPI_COMM_WORLD, &request);
        MPI_Wait(&request, &status);
    }
    
    err = MPI_Finalize();
    return 0;
}

一个多次使用临时通信句柄的错误案例

//错误案例
MPI_Request request;
MPI_Status status;
int buf[100];
for (int i = 0; i < 10; i++) {
    MPI_Recv(buf, 100, MPI_INT, 0, 0, MPI_COMM_WORLD, &status, &request);
    // 这里可能会出现 MPI_ERR_REQUEST 错误
}


//如果要多次使用临时句柄,那就要多个临时句柄
MPI_Request requests[10];
MPI_Status statuses[10];
int buf[10][100];
for (int i = 0; i < 10; i++) {
    MPI_Recv(buf[i], 100, MPI_INT, 0, 0, MPI_COMM_WORLD, &statuses[i], &requests[i]);
}
MPI_Waitall(10, requests, statuses);

MPI_Send_init 创建持久性句柄

int MPI_Send_init(const void *buf, int count, MPI_Datatype datatype, int dest, int tag, 
			MPI_Comm comm, MPI_Request *request)
  • buf:void* 类型,发送缓冲区起始地址;
  • count:int 类型,发送缓冲区中元素的个数;
  • datatype:MPI_Datatype 类型,发送元素的 MPI 数据类型;
  • dest:int 类型,接收消息的进程编号;
  • tag:int 类型,消息标识;
  • comm:MPI_Comm 类型,消息通信域;
  • request:MPI_Request* 类型,通信请求句柄(持久化)。

使用该接口生成的持久化句柄,需要使用专用接口进行资源释放MPI_Request_free()

代码使用案例

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

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

    //发送操作的缓冲区和发送目标
    int send_data = rank;
    int dest = (rank + 1) % size;

    //创建持久化通信请求句柄
    MPI_Request request;
    MPI_Send_init(&send_data, 1, MPI_INT, dest, 0, MPI_COMM_WORLD, &request);
	
	//可以重复的使用该句柄,前提是重复相同的数据,如果不同,则创建使用临时句柄
    for (int i = 0; i < size; i++) {
        //启动发送消息
        MPI_Start(&request);
        printf("Rank %d is sending data to Rank %d\n", rank, dest);
        //等待发送完成
        MPI_Wait(&request, MPI_STATUS_IGNORE);
        printf("Rank %d has sent data to Rank %d\n", rank, dest);
    }

    //释放持久化通信请求句柄
    MPI_Request_free(&request);

    MPI_Finalize();
    return 0;
}

在这里插入图片描述

临时句柄和持久性句柄的选择

  1. 多次循环发送不同的数据必须使用临时句柄
  2. 如果多次发送的数据是一样的,那么就可以使用持久化的句柄。

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

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

相关文章

uniapp iOS打包证书申请流程——mac

如何在 Mac 创建 iOS 打包证书&#xff1f; 文章目录 如何在 Mac 创建 iOS 打包证书&#xff1f;会员 VS 非会员权限步骤添加设备创建标识符生成证书生成描述文件 前提&#xff1a; Mac 电脑Apple ID 申请Apple ID成为开发者 developer 注意&#xff1a; 登录 Apple ID 成为开…

2023年数字孪生行业研究报告

第一章 行业概况 1.1 定义 数字孪生&#xff08;Digital Twin&#xff09;是一种先进的建模技术&#xff0c;它通过创建一个物理实体的虚拟复制品&#xff0c;以实时模拟、预测和优化实体的行为和性能。这个虚拟模型会同步收集和分析来自其物理对应物的数据&#xff0c;从而提…

【DRONECAN】(三)WSL2 及 ubuntu20.04 CAN 驱动安装

【DRONECAN】&#xff08;三&#xff09;WSL2 及 ubuntu20.04 CAN 驱动安装 前言 这一篇文章主要介绍一下 WSL2 及 ubuntu20.04 CAN 驱动的安装&#xff0c;首先说一下介绍本文的目的。 大家肯定都接触过 ubuntu 系统&#xff0c;但是我们常用的操作系统都是 Windows&#x…

JavaSE基础(2)

1 方法的使用 思维导图 1.1 什么是方法 方法就是一个代码片段. 类似于 C 语言中的 “函数”。方法存在的意义(不要背, 重在体会): 是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置使用.让代码更好理解更简单.直接调用现有方法…

基于金枪鱼群算法优化的BP神经网络(预测应用) - 附代码

基于金枪鱼群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于金枪鱼群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.金枪鱼群优化BP神经网络2.1 BP神经网络参数设置2.2 金枪鱼群算法应用 4.测试结果&#xff1a;5…

肠道微生物群肾衰竭

编者推荐 该研究应用多组学分析&#xff08;代谢组学分析微生物组学分析&#xff09;分析了人类ESRD肠道微生物组组成、尿毒症毒素和肾衰竭之间的关系&#xff0c;使用独立队列和无菌动物模型对多组学结果及研究提出的ESRD机制假设进行验证&#xff0c;首次从肠道微生物的角度…

qt第一天

#include "widget.h" #include "ui_widget.h" #include "QDebug" Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->resize(QSize(800,600)); //使用匿名对象&#xff0c;调用重…

嵌入式Linux开发实操(十五):nand flash接口开发

# 前言 flash memory,分NAND和NOR: 如果说nor flash有个特点就是能执行代码,NOR并行接口具有地址和数据总线,spi flash更是主要用于存储代码,SPI(或QSPI)NOR代码可就地执行(XiP),一般系统要求flash闪存提供相对较高的频率和数据缓存的clocking。而nand flash主要用于…

QT Creator工具介绍及使用

一、QT的基本概念 QT主要用于图形化界面的开发&#xff0c; QT是基于C编写的一套界面相关的类库&#xff0c;如进程线程库&#xff0c;网络编程的库&#xff0c;数据库操作的库&#xff0c;文件操作的库等。 如何使用这个类库&#xff1a;类库实例化对象(构造函数) --> 学习…

Django静态文件媒体文件文件上传

文章目录 一、静态文件和媒体文件1.在django中使用静态文件实践2.在django中使用媒体文件 二、文件上传单文件上传实践多文件上传 一、静态文件和媒体文件 媒体文件: 用户上传的文件&#xff0c;叫做media 静态文件:存放在服务器的css,js,image,font等 叫做static1.在django中…

【Flutter】使用Android Studio 创建第一个flutter应用。

前言 首先下载好 flutter sdk和 Android Studio。 FlutterSDK下载 Android Studio官网 配置 我的是 windows。 where.exe flutter dart查看flutter安装环境。 如果没有&#xff0c;自己在环境变量的path添加下flutter安装路径。 在将 Path 变量更新后&#xff0c;打开一个…

QTday1(第一个QT界面、常用类与组件)

一、Xmind整理&#xff1a; Assistant帮助文档的使用&#xff1a; 设计师界面的介绍&#xff1a; 各文件之间调用方式&#xff1a; 二、上课笔记整理&#xff1a; 1.第一个QT界面 ①创建自定义类时需要指定父类 ②第一个界面的相关操作 #include "mainwindow.h"…

比Python快3.5万倍的Mojo融资7亿,LLVM之父:不会威胁到Python,该恐惧的应该是C++

近日&#xff0c;Modular AI 公司宣布成功融资 1 亿美元&#xff08;约 7.29 亿人民币&#xff09;&#xff0c;据称这是继去年 3000 万美元融资之后的第二轮融资。 Modular AI 称他们未来的愿景是通过 AI 引擎和 Mojo 为全球开发者提供 AI 基础设施。 Modular AI 是 Chris La…

maven本地安装jar包install-file,解决没有pom的问题

背景&#xff1a; 公司因为权限问题&#xff0c;没有所有的代码&#xff0c;内部maven还在搭建&#xff0c;所以需要拿到同事的jar包&#xff0c;本地install&#xff1a; mvn install:install-file -DgroupIdcom..framework -DartifactIdcloud-api -Dversion1.0.0-SNAPSHOT …

Blender 3D建模要点

3d模型可以为场景的仿真模拟带来真实感,它还有助于更轻松地识别场景中的所有内容。 例如,如果场景中的所有对象都是简单的形状,如立方体和圆形,则很难在仿真中区分对象。 1,碰撞形状与视觉形状 像立方体和球体这样的简单形状,通常被称为“基本体”,通常用作碰撞块。 与…

js优雅的统计字符串字符出现次数

题目如下 统计一串字符串中每个字符出现的频率 示例字符串 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfd小白写法 let str asdfasqwerqwrdfafafasdfopasdfopckpasdfassfdlet result {}; for (let i 0; i < str.length; i) {if (result[str[i]]) {result[str[…

【算法训练-字符串】一 最长无重复子串

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是最长无重复子串或最长无重复子数组&#xff0c;这类题目出现频率还是很高的。 最长无重复子串【MID】 先来看字符串数据结构的题目 题干 解题思…

链接minio出现S3 API Requests must be made to API port. 错误记录

网上找了个链接的demo默认端口是9000 然后我登录了MinMo服务器&#xff0c;登录端口确实也是9000 不过我是通过1panle安装的 信息如下 表面了API连接要用&#xff1a;9001端口才行 修改后重启 ok