C++进程链接工具之通信器详解

目录
  • 一、传播者
  • 二、示例和代码

一、传播者

本章中的所有示例仅使用一个连接所有进程的通信器。但是,可以创建更多的通信器来链接进程的子集。这对于不需要由所有进程执行的集体操作特别有用。

二、示例和代码

示例 47.15。使用多个通信器

#include <boost/mpi.hpp>
#include <boost/serialization/string.hpp>
#include <string>
#include <iostream>
int main(int argc, char *argv[])
{
  boost::mpi::environment env{argc, argv};
  boost::mpi::communicator world;
  boost::mpi::communicator local = world.split(world.rank() < 2 ? 99 : 100);
  std::string s;
  if (world.rank() == 0)
    s = "Hello, world!";
  boost::mpi::broadcast(local, s, 0);
  std::cout << world.rank() << ": " << s << '\n';
}

Example47.15

示例 47.15 使用函数 boost::mpi::broadcast()。此函数发送字符串“Hello, world!”从等级为 0 的进程到链接到本地​​通信器的所有进程。等级为 0 的进程也必须链接到该通信器。

本地通信器是通过调用 split() 创建的。 split() 是在全局通信器世界上调用的成员函数。 split() 需要一个整数来将进程链接在一起。将相同整数传递给 split() 的所有进程都链接到相同的通信器。传递给 split() 的整数值无关紧要。重要的是应该由特定通信器链接的所有进程都传递相同的值。

在示例 47.15 中,等级为 0 和 1 的两个进程将 99 传递给 split()。如果程序启动时有两个以上的进程,则额外的进程会传递 100。这意味着前两个进程有一个本地通信器,所有其他进程都有另一个本地通信器。每个进程都链接到 split() 返回的通信器。是否有其他进程链接到同一个通信器取决于其他进程是否将相同的整数传递给 split()。

请注意,等级始终与传播者有关。最低等级始终为 0。在示例 47.15 中,相对于全局通信器具有等级 0 的进程相对于其本地通信器也具有等级 0。相对于全局通信器具有等级 2 的进程相对于其本地通信器具有等级 0。

如果您使用两个或更多进程启动示例 47.15,您好,世界!将显示两次 - 每次由相对于全局通信器的等级为 0 和 1 的进程显示一次。因为 s 设置为“Hello, world!”仅在全局等级为 0 的进程中,此字符串仅通过通信器发送到链接到同一通信器的那些进程。这只是具有全局排名 1 的进程,这是唯一将 99 传递给 split() 的其他进程。

示例 47.16。使用组对流程进行分组

#include <boost/mpi.hpp>
#include <boost/serialization/string.hpp>
#include <boost/range/irange.hpp>
#include <boost/optional.hpp>
#include <string>
#include <iostream>
int main(int argc, char *argv[])
{
  boost::mpi::environment env{argc, argv};
  boost::mpi::communicator world;
  boost::mpi::group local = world.group();
  boost::integer_range<int> r = boost::irange(0, 1);
  boost::mpi::group subgroup = local.exclude(r.begin(), r.end());
  boost::mpi::communicator others{world, subgroup};
  std::string s;
  boost::optional<int> rank = subgroup.rank();
  if (rank)
  {
    if (rank == 0)
      s = "Hello, world!";
    boost::mpi::broadcast(others, s, 0);
  }
  std::cout << world.rank() << ": " << s << '\n';
}

MPI 支持分组进程。这是在类 boost::mpi::group 的帮助下完成的。如果您在通信器上调用成员函数 group(),则链接到通信器的所有进程都将在类型为 boost::mpi::group 的对象中返回。您不能使用此对象进行通信。它只能用于形成一组新的进程,然后可以从中创建通信器。

boost::mpi::group 提供成员函数,如 include() 和 exclude()。您传递迭代器以包含或排除进程。 include() 和 exclude() 返回一个类型为 boost::mpi::group 的新组。

示例 47.16 将两个迭代器传递给 exclude(),它们引用类型为 boost::integer_range 的对象。该对象表示一个整数范围。它是在函数 boost::irange() 的帮助下创建的,它需要一个下限和上限。上限是一个不属于该范围的整数。在此示例中,这意味着 r 仅包含整数 0。

调用 exclude() 会导致创建子组,其中包含除等级为 0 的进程之外的所有进程。然后使用该组创建一个新的通信器 others。这是通过将全局通信器世界和子组传递给 boost::mpi::communicator 的构造函数来完成的。

请注意,others 是一个 communicator,它在 rank 0 的进程中是空的。rank 0 的进程没有链接到这个 communicator,但是变量 others 仍然存在于这个进程中。您必须注意不要在此过程中使用其他人。示例 47.16 通过在子组上调用 rank() 来防止这种情况。成员函数在不属于该组的进程中返回一个类型为 boost::optional 的空对象。其他进程接收它们相对于该组的等级。

如果 rank() 返回排名并且没有类型为 boost::optional 的空对象,则调用 boost::mpi::broadcast()。等级为 0 的进程发送字符串“Hello, world!”链接到其他通信器的所有进程。请注意,等级是相对于那个传播者的。相对于其他进程排名为 0 的进程相对于全球通信者世界排名为 1。

如果您使用两个以上的进程运行示例 47.16,则全局等级大于 0 的所有进程都将显示 Hello, world!。

到此这篇关于C++进程链接工具之通信器详解的文章就介绍到这了,更多相关C++通信器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++通信新特性协程详细介绍

    目录 一.关于协程 二.协程的好处 三.协程得用法 四.与线程的区别 五.协程示例 一.关于协程 从 1.54.0 版本开始,Boost.Asio 支持协程.虽然您可以直接使用 Boost.Coroutine,但 Boost.Asio 中对协程的显式支持使得使用它们变得更加容易. 协程让您创建一个反映实际程序逻辑的结构.异步操作不会拆分函数,因为没有处理程序来定义异步操作完成时应该发生什么.程序可以使用顺序结构,而不是让处理程序相互调用. 二.协程的好处 考虑多任务协作的场景. 如果是线程的并发

  • 浅析C\C++和Lua的通信方式

    为了实现Lua和其他语言之间的通信,Lua虚拟机为C\C++提供了两个特性: 一,Lua_State状态机 lua_State主要是管理一个lua虚拟机的执行环境, 一个lua虚拟机可以有多个执行环境.Lua虚拟机通过维护这样一个虚拟栈来实现两种之间的通信,lua_State定义如下: struct lua_State { CommonHeader; lu_byte status; StkId top; /* first free slot in the stack */ global_Stat

  • C++线程间的互斥和通信场景分析

    互斥锁(mutex) 为了更好地理解,互斥锁,我们可以首先来看这么一个应用场景:模拟车站卖票. 模拟车站卖票 场景说明: Yang车站售卖从亚特兰蒂斯到古巴比伦的时光飞船票:因为机会难得,所以票数有限,一经发售,谢绝补票. 飞船票总数:100张: 售卖窗口:3个. 对于珍贵的飞船票来说,这个资源是互斥的,比如第100张票,只能卖给一个人,不可能同时卖给两个人.3个窗口都有权限去售卖飞船票(唯一合法途径). 不加锁的结果 根据场景说明,我们可以很快地分析如下: 可以使用三个线程来模拟三个独立的窗口

  • C++广播通信实例

    本文实例讲述了C++实现广播通信的方法.分享给大家供大家参考.具体实现方法如下: 广播通信代码框架: 1. 协议都是: 复制代码 代码如下: SOCKET s = ::socket(AF_INET, SOCK_DGRAM, 0); 2. 服务端设置选项 复制代码 代码如下: BOOL bBroadcast = TRUE;  ::setsockopt(s, SOL_SOCKET, SO_BROADCAST, (char*)&bBroadcast, sizeof(BOOL)); 3. 服务端向255

  • C++ 实现即时通信的示例代码(直接运行)

    目录 题目 软件:VS 服务器端 客户端 题目 由于本学期上了网络编程课程,老师要求写使用Socke实现网络编程.于是参考C++多线程实现即时通信软件写出了简单版本的没有界面的即时通信软件. 软件:VS 直接上代码,需要讲解原理的,可以参考C++多线程实现即时通信软件 服务器端 //TcpServer_plus.exe #include<stdio.h> #include <Winsock2.h> #include<WS2tcpip.h> #pragma comment

  • C++基于boost asio实现sync tcp server通信流程详解

    目录 一.功能介绍 二.string类型数据交互 2.1 程序源码 2.2 编译&&执行 2.3 程序执行结果 三.byte类型数据交互 3.1 程序源码 3.2 编译&&执行 3.3 程序执行结果 一.功能介绍   基于boost asio实现server端通信,采用one by one的同步处理方式,并且设置连接等待超时.下面给出了string和byte两种数据类型的通信方式,可覆盖基本通信场景需求. 二.string类型数据交互   规定server与client双方

  • C++多线程实现TCP服务器端同时和多个客户端通信

    通讯建立后首先由服务器端发送消息,客户端接收消息:接着客户端发送消息,服务器端接收消息,实现交互发送消息. 服务器同时可以和多个客户端建立连接,进行交互: 在某次交互中,服务器端或某客户端有一方发送"end"即终止服务器与其的通信:服务器还可以继续接收其他客户端的请求,与其他客户端通信. 服务器端 #include <WinSock2.h> #include <WS2tcpip.h> #include <iostream> using namespa

  • C++ Thread实现简单的socket多线程通信

    目录 起因 服务端 ROS客户端 普通客户端 运行效果 不足 起因 为什么要用C++的Thread,很简单,因为我菜 一打五用pthread实现了socket多线程通信,我之前学并发的时候没看pthread,因此代码只能看个大概,后面还是要系统学一下pthread的 服务端 多线程功能放在腾讯云服务器上,代码如下: #include "tcpserver.h" #include <thread> #include <mutex> TcpServer server

  • C++详细分析线程间的同步通信

    目录 1.多线程编程两个问题 1.1.线程间的互斥 1.2.线程间的同步通信 2.生产者-消费者线程模型 3.lock_gard和unique_lock 4.流程分析 1.多线程编程两个问题 1.1.线程间的互斥 竞态条件: 多线程执行的结果是一致的,不会随着CPU对线程不同的调用顺序,而产生不同的运行结果. 发生竞态条件的代码段,称为临界区代码段(只有一个线程可以进来),保证临界区代码段原子操作,通过线程互斥锁mutex,也可以使用轻量级的无锁实现CAS. C++11的mutex底层实现: 使

  • C++进程链接工具之通信器详解

    目录 一.传播者 二.示例和代码 一.传播者 本章中的所有示例仅使用一个连接所有进程的通信器.但是,可以创建更多的通信器来链接进程的子集.这对于不需要由所有进程执行的集体操作特别有用. 二.示例和代码 示例 47.15.使用多个通信器 #include <boost/mpi.hpp> #include <boost/serialization/string.hpp> #include <string> #include <iostream> int main

  • C#使用命名管道Pipe进行进程通信实例详解

    1.新建解决方案NamedPipeExample 新建两个项目:Client和Server,两者的输出类型均为"Windows 应用程序".整个程序的结构如下图所示. 此Form1为Client的窗体,如下图所示. 后端代码,如下. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using Syst

  • SpringMVC中的拦截器详解及代码示例

    本文研究的主要是SpringMVC中的拦截器的介绍及实例代码,配置等内容,具体如下. Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用方法. 1. springmvc拦截器的定义和配置 1.1 springmvc拦截器的定义 在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下: /

  • GIT相关-IDEA/ECLIPSE工具配置的教程详解

    GIT安装 访问: https://git-scm.com/downloads ,进入git'下载页面,根据个人操作系统下载对应软件版本,默认下载最新版: 双击安装即可.选择安装目录和安装内容,如果只是单纯的使用,默认即可. 安装TortoiseGit 安装前,确认Git已安装好,否则TortoiseGit是装不上的. 访问 : https://tortoisegit.org/download/,选择对应的操作系统位数软件下载, 双击软件,点击next,默认安装即可 生成秘钥 开始菜单找到git

  • python 装饰器详解与应用范例

    什么是装饰器 从字面意思上来看,装饰器是用来装饰其他东西的工具.在python中装饰器分为函数装饰器和类装饰器. 简而言之,函数装饰器是用来装饰函数的装饰器,其主要目的是增加目标函数的功能,类装饰器也就是装饰类的装饰器,增加类的功能. 函数装饰器 装饰器本质是嵌套函数 下面是一个简单的装饰器 # fun1为装饰器名称,function指的是被装饰的函数 def fun1(function): def fun2(): print("开始了!") function() # 执行被装饰的函数

  • unified如何处理markdown解析器详解

    目录 unified是什么 unified生态简介 工作原理 Parse Transform Stringify 牛刀小试 环境搭建 处理ESM类型包 最简用法 加载文档meta 一个实际使用例子: unified是什么 unified是用于文档处理的生态系统,核心包提供了文档处理的流程控制,具体功能由生态系统中各个插件提供.例如我们如果需要处理markdown,就需要使用markdown处理相关的插件.当然除了markdwon以外,还提供了处理HTML.JSX等的插件.其良好的扩展能力能让我们

  • Flutter使用Android原生播放器详解

    接上篇:播放器-IOS(Swift)篇 安卓端原生播放器的接入思路与ios基本一致,所以本篇就不废话了,直接上代码: 创建插件VideoViewPlugin实现FlutterPlugin: package io.flutter.plugins.videoplayer; import android.util.Log; import androidx.annotation.NonNull; import io.flutter.embedding.engine.plugins.FlutterPlug

  • web开发之对比时间大小的工具函数的实例详解

    web开发之对比时间大小的工具函数的实例详解 js时间大小比较,格式yyyy-MM-dd hh:mm:ss 把时间比较封装成一个工具函数: /** * 比较两个时间的大小 * 时间格式:yyyy-MM-dd hh:mm:ss * @param {Object} beginTime 开始时间 * @param {Object} endTime 结束时间 */ var getDataLarge = function(beginTimeString,endTimeString){ var b = be

  • 基于node.js之调试器详解

    1.在命令行窗口中,可以使用"node debug" 命令来启用调试器,代码如下: node debug<需要被执行的脚本文件名>接下来根据一个实例进行学习调试过程: 编写app.js文件进行调试: console.log('hello,word') function foo(){ console.log('hello,foo') return 100; } var bar = 'This is a pen'; var http = require('http') var

  • Android 网络html源码查看器详解及实例

    Android 网络html源码查看器详解及实例 IO字节流的数据传输了解 Handler的基本使用 1.作品展示 2.需要掌握的知识 FileInputStream,FIleOutputStream,BufferInputStream,BufferOutStream的读写使用与区别 //进行流的读写 byte[] buffer = new byte[1024 * 8]; //创建一个写到内存的字节数组输出流 ByteArrayOutputStream byteArrayOutputStream

随机推荐