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

 更新时间:2022年11月20日 08:51:23   作者:无水先生  
本文主要介绍了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++通信器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c++创建二维动态数组与内存释放问题

    c++创建二维动态数组与内存释放问题

    这篇文章主要介绍了c++创建二维动态数组与内存释放问题,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • C 标准I/O库的粗略实现教程

    C 标准I/O库的粗略实现教程

    下面小编就为大家分享一篇C 标准I/O库的粗略实现教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C语言实现高精度加减法

    C语言实现高精度加减法

    这篇文章主要为大家详细介绍了C语言实现高精度加减法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • C语言进阶输入输出重定向与fopen函数使用示例详解

    C语言进阶输入输出重定向与fopen函数使用示例详解

    这篇文章主要为大家介绍了C语言进阶输入输出重定向与fopen函数的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • 一文详解C++的程序流程控制

    一文详解C++的程序流程控制

    这篇文章主要介绍了一文详解C++的程序流程控制,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Qt中QDateTimeEdit的具体使用

    Qt中QDateTimeEdit的具体使用

    本文主要介绍了Qt中QDateTimeEdit的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • 深入理解线程安全与Singleton

    深入理解线程安全与Singleton

    在编译器未优化的情况下顺序如下:1.new operator分配适当的内存;2.在分配的内存上构造Singleton对象;3.内存地址赋值给_instance
    2013-09-09
  • 为什么要学习C语言 C语言优势分析

    为什么要学习C语言 C语言优势分析

    不止一个学生问到我:“老师,为什么我们的应用程序设计要学C语言而不是别的?C语言不是已经过时了吗?如果现在要写一个Windows程序,用VB或Dephi开发多快呀,用C行吗?退一万步,为什么选择C而不是C++呢?”
    2013-07-07
  • C语言实现学生宿舍信息管理系统课程设计

    C语言实现学生宿舍信息管理系统课程设计

    这篇文章主要为大家详细介绍了C语言实现学生宿舍信息管理系统课程设计,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 浅谈C++虚重载操作符 virtual operator= 的使用方法

    浅谈C++虚重载操作符 virtual operator= 的使用方法

    下面小编就为大家带来一篇浅谈C++虚重载操作符 virtual operator= 的使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01

最新评论