iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++集体数据交换如何实现
  • 536
分享到

C++集体数据交换如何实现

2023-07-04 15:07:22 536人浏览 独家记忆
摘要

本文小编为大家详细介绍“c++集体数据交换如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++集体数据交换如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、说明到目前为止介绍的功能共享一对一的关

本文小编为大家详细介绍“c++集体数据交换如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++集体数据交换如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

一、说明

到目前为止介绍的功能共享一对一的关系:即一个进程发送和一个进程接收。链接是通过标签建立的。对于一个进程,函数可能会发送数据,对于另一个进程,它可能会接收数据。这些功能称为集体操作。

二、示例和代码

示例 47.9。使用 gather() 从多个进程接收数据

#include <boost/mpi.hpp>#include <boost/serialization/string.hpp>#include <vector>#include <string>#include <iterator>#include <alGorithm>#include <iOStream>int main(int arGC, char *argv[]){  boost::mpi::environment env{argc, argv};  boost::mpi::communicator world;  if (world.rank() == 0)  {    std::vector<std::string> v;    boost::mpi::gather<std::string>(world, "", v, 0);    std::ostream_iterator<std::string> out{std::cout, "\n"};    std::copy(v.begin(), v.end(), out);  }  else if (world.rank() == 1)  {    boost::mpi::gather(world, std::string{"Hello, world!"}, 0);  }  else if (world.rank() == 2)  {    boost::mpi::gather(world, std::string{"Hello, moon!"}, 0);  }}

Example47.9

示例 47.9 在多个进程中调用函数 boost::mpi::gather()。函数是发送还是接收取决于参数。

等级为 1 和 2 的进程使用 boost::mpi::gather() 发送数据。它们将发送的数据作为参数传递&mdash;&mdash;字符串“Hello, world!”和“你好,月亮!” &ndash; 以及数据应传输到的进程的级别。由于 boost::mpi::gather() 不是成员函数,因此还必须传递 communicator world。

等级为 0 的进程调用 boost::mpi::gather() 来接收数据。由于数据必须存储在某个地方,因此传递了一个 std::vector<std::string> 类型的对象。请注意,您必须将此类型与 boost::mpi::gather() 一起使用。不支持其他容器或字符串类型。

排名 0 的进程必须传递与排名 1 和 2 的进程相同的参数。这就是排名 0 的进程也传递 world、要发送的字符串和 0 到 boost::mpi::gather() 的原因。

如果您使用三个进程启动示例 47.9,您好,世界!和你好,月亮!被显示。如果仔细查看输出,您会注意到首先写入了一个空行。第一行是等级为 0 的进程传递给 boost::mpi::gather() 的空字符串。 v 中有三个字符串,它们是从等级为 0、1 和 2 的进程接收的。向量中元素的索引对应于进程的等级。如果多次运行该示例,您将始终得到一个空字符串作为向量中的第一个元素,“Hello, world!”作为第二个元素和“你好,月亮!”作为第三个。

请注意,您不得使用超过三个进程运行示例 47.9。例如,如果您使用 -n 4 启动 mpiexec,则不会显示任何数据。该程序将挂起,必须使用 CTRL+C 中止。

必须对所有进程执行集体操作。如果您的程序调用诸如 boost::mpi::gather() 之类的函数,您必须确保该函数在所有进程中都被调用。否则就违反了 MPI 标准。因为像 boost::mpi::gather() 这样的函数必须被所有进程调用,所以每个进程的调用通常没有不同,如示例 47.9 所示。将前面的示例与执行相同操作的示例 47.10 进行比较。

示例 47.10。使用 gather() 从所有进程收集数据

#include <boost/mpi.hpp>#include <boost/serialization/string.hpp>#include <vector>#include <string>#include <iterator>#include <algorithm>#include <iostream>int main(int argc, char *argv[]){  boost::mpi::environment env{argc, argv};  boost::mpi::communicator world;  std::string s;  if (world.rank() == 1)    s = "Hello, world!";  else if (world.rank() == 2)    s = "Hello, moon!";  std::vector<std::string> v;  boost::mpi::gather(world, s, v, 0);  std::ostream_iterator<std::string> out{std::cout, "\n"};  std::copy(v.begin(), v.end(), out);}

您为所有流程中的集体操作调用函数。通常函数的定义方式很清楚必须执行哪个操作,即使所有进程都传递相同的参数。

示例 47.10 使用 boost::mpi::gather() 来收集数据。数据在其等级作为最后一个参数传递给 boost::mpi::gather() 的过程中收集。此进程收集它从所有进程接收的数据。存储数据的向量仅供收集数据的进程使用。

boost::mpi::gather() 从所有进程收集数据。这包括收集数据的过程。在示例 47.10 中,这是等级为 0 的进程。该进程在 s 中向自身发送一个空字符串。空字符串存储在 v 中。正如您将在以下示例中看到的,集合操作始终包括所有进程。

您可以使用任意数量的进程运行示例 47.10,因为每个进程都会调用 boost::mpi::gather()。如果您使用三个进程运行该示例,结果将与前面的示例类似。

示例 47.11。在所有进程中使用 scatter() 分散数据

#include <boost/mpi.hpp>#include <boost/serialization/string.hpp>#include <vector>#include <string>#include <iostream>int main(int argc, char *argv[]){  boost::mpi::environment env{argc, argv};  boost::mpi::communicator world;  std::vector<std::string> v{"Hello, world!", "Hello, moon!",    "Hello, sun!"};  std::string s;  boost::mpi::scatter(world, v, s, 0);  std::cout << world.rank() << ": " << s << '\n';}

Example47.11

示例 47.11 介绍了函数 boost::mpi::scatter()。它与 boost::mpi::gather() 相反。 boost::mpi::gather() 将来自多个进程的数据收集到一个进程中,而 boost::mpi::scatter() 将来自一个进程的数据分散到多个进程中。

示例 47.11 将来自排名为 0 的进程的 v 中的数据分散到所有进程,包括它自己。等级为 0 的进程接收到字符串“Hello, world!”在 s 中,排名为 1 的进程收到“你好,月亮!”在 s 中,等级为 2 的进程收到“Hello, sun!”秒。

示例 47.12。使用 broadcast() 向所有进程发送数据

#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;  std::string s;  if (world.rank() == 0)    s = "Hello, world!";  boost::mpi::broadcast(world, s, 0);  std::cout << s << '\n';}

boost::mpi::broadcast() 将数据从一个进程发送到所有进程。此函数与 boost::mpi::scatter() 之间的区别在于将相同的数据发送到所有进程。在示例 47.12 中,所有进程都收到字符串“Hello, world!”在 s 中写下你好,世界!到标准输出流。

示例 47.13。使用 reduce() 收集和分析数据

#include <boost/mpi.hpp>#include <boost/serialization/string.hpp>#include <string>#include <iostream>std::string min(const std::string &lhs, const std::string &rhs){  return lhs.size() < rhs.size() ? lhs : rhs;}int main(int argc, char *argv[]){  boost::mpi::environment env{argc, argv};  boost::mpi::communicator world;  std::string s;  if (world.rank() == 0)    s = "Hello, world!";  else if (world.rank() == 1)    s = "Hello, moon!";  else if (world.rank() == 2)    s = "Hello, sun!";  std::string result;  boost::mpi::reduce(world, s, result, min, 0);  if (world.rank() == 0)    std::cout << result << '\n';}

boost::mpi::reduce() 从多个进程收集数据,如 boost::mpi::gather()。但是,数据不存储在向量中。 boost::mpi::reduce() 需要一个函数或函数对象,它将用于分析数据。

如果您使用三个进程运行示例 47.13,则排名为 0 的进程会收到字符串“Hello, sun!”结果。对 boost::mpi::reduce() 的调用收集并分析所有进程传递给它的字符串。它们使用函数 min() 进行分析,该函数作为第四个参数传递给 boost::mpi::reduce()。 min() 比较两个字符串并返回较短的一个。

如果您使用三个以上的进程运行示例 47.13,则会显示一个空字符串,因为排名大于 2 的所有进程都会将一个空字符串传递给 boost::mpi::reduce()。将显示空字符串,因为它比“Hello, sun!”短

示例 47.14。使用 all_reduce() 收集和分析数据

#include <boost/mpi.hpp>#include <boost/serialization/string.hpp>#include <string>#include <iostream>std::string min(const std::string &lhs, const std::string &rhs){  return lhs.size() < rhs.size() ? lhs : rhs;}int main(int argc, char *argv[]){  boost::mpi::environment env{argc, argv};  boost::mpi::communicator world;  std::string s;  if (world.rank() == 0)    s = "Hello, world!";  else if (world.rank() == 1)    s = "Hello, moon!";  else if (world.rank() == 2)    s = "Hello, sun!";  std::string result;  boost::mpi::all_reduce(world, s, result, min);  std::cout << world.rank() << ": " << result << '\n';}

Example47.14

示例 47.14 使用函数 boost::mpi::all_reduce(),它像 boost::mpi::reduce() 一样收集和分析数据。这两个函数之间的区别在于 boost::mpi::all_reduce() 将分析结果发送到所有进程,而 boost::mpi::reduce() 使结果仅可用于排名作为传递的进程最后一个参数。因此,没有排名传递给 boost::mpi::all_reduce()。如果您使用三个进程运行示例 47.14,每个进程都会写入 Hello, sun!到标准输出流。

读到这里,这篇“C++集体数据交换如何实现”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网其他教程频道。

--结束END--

本文标题: C++集体数据交换如何实现

本文链接: https://www.lsjlt.com/news/346094.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++集体数据交换如何实现
    本文小编为大家详细介绍“C++集体数据交换如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++集体数据交换如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、说明到目前为止介绍的功能共享一对一的关...
    99+
    2023-07-04
  • C++集体数据交换实现示例讲解
    目录一、说明二、示例和代码一、说明 到目前为止介绍的功能共享一对一的关系:即一个进程发送和一个进程接收。链接是通过标签建立的。本节介绍在多个进程中调用相同参数但执行不同操作的函数。对...
    99+
    2022-11-21
    C++集体数据交换 C++数据交换
  • C++怎么实现异步数据交换
    本篇内容介绍了“C++怎么实现异步数据交换”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!异步数据交换,除了阻塞函数 send() 和 rec...
    99+
    2023-07-04
  • Redis如何实现数据的交集、并集和补集
    本篇内容介绍了“Redis如何实现数据的交集、并集和补集”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!场景...
    99+
    2024-04-02
  • thymeleaf如何实现前后端数据交换
    今天小编给大家分享一下thymeleaf如何实现前后端数据交换的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Thymelea...
    99+
    2023-07-02
  • JS如何实现数组交集、并集、差集
    这篇文章主要介绍了JS如何实现数组交集、并集、差集,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:由于下面会用到ES5的方法,低版本...
    99+
    2024-04-02
  • C++异步数据交换实现方法介绍
    异步数据交换,除了阻塞函数 send() 和 recv() 之外,Boost.MPI 还支持与成员函数 isend() 和 irecv() 的异步数据交换。名称以 i 开头,表示函数...
    99+
    2022-11-21
    C++异步数据交换 C++数据交换
  • C++如何实现成对交换节点
    这篇文章主要讲解了“C++如何实现成对交换节点”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++如何实现成对交换节点”吧!Swap Nodes in Pairs 成对交换节点Given a...
    99+
    2023-06-19
  • 详解C#如何实现窗体换肤
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-31
    C#实现窗体换肤 C#窗体换肤 C#窗体
  • shell如何实现并集和交集
    这篇文章主要介绍了shell如何实现并集和交集,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。并集和交集comm 可以用来求并集,交集,差集,...
    99+
    2024-04-02
  • C语言如何实现交换排序算法
    这篇文章主要介绍了C语言如何实现交换排序算法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言如何实现交换排序算法文章都会有所收获,下面我们一起来看看吧。一、冒泡排序1.基本思想对于很多同学来说冒泡排序是再熟...
    99+
    2023-07-02
  • SpringBoot如何实现数据交互
    这篇文章主要介绍“SpringBoot如何实现数据交互”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot如何实现数据交互”文章能帮助大家解决问题。1. 数据格式在实际的项目场景中,前...
    99+
    2023-06-29
  • c语言如何实现两个值互相交换的函数
    小编给大家分享一下c语言如何实现两个值互相交换的函数,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!c语言中实现两个值互换的函数。#include <...
    99+
    2023-06-15
  • 如何使用 Python 框架的 HTTP API 实现数据交换?
    当今互联网时代,数据交换是各种应用程序之间必不可少的一部分。Python框架的HTTP API是一种常用的数据交换方式,本文将介绍如何使用Python框架的HTTP API实现数据交换。 一、什么是HTTP API? HTTP API是一种...
    99+
    2023-10-06
    框架 api http
  • C#实现变量交换、斐波那契数列、质数、回文方法合集
    目录交换两个变量的方法使用C#中的第三个变量交换两个数字不使用第三个变量交换数字的方法不使用第三个变量交换字符串的方法斐波纳奇数列如何从斐波那契数列中找到第N个斐波那契数列编号?质数...
    99+
    2024-04-02
  • 基于ASP.NET网页如何实现C#数据采集
    本篇内容主要讲解“基于ASP.NET网页如何实现C#数据采集”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于ASP.NET网页如何实现C#数据采集”吧!C#数据采集大体可以分为两部曲:一部曲:...
    99+
    2023-06-18
  • es6如何实现变量交换
    本篇内容主要讲解“es6如何实现变量交换”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6如何实现变量交换”吧! 变量交换方法:1...
    99+
    2024-04-02
  • Python 如何实现变量交换
    简洁优雅的 C 写法: int a = 1;  int b = 2;  int temp;  temp = a;  a = b;  b = temp;  简洁优雅的 Python 写...
    99+
    2024-04-02
  • C#如何求两个List字典类型数据的交集
    要求两个List中字典类型数据的交集,可以使用LINQ查询语句和Intersect方法来实现。以下是一个示例代码: using Sy...
    99+
    2024-04-02
  • 如何实现WinForm窗体间交互
    这篇文章主要介绍如何实现WinForm窗体间交互,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在窗体间传递数据的方法比较多:1,在子窗体中自定义一个构造函数,参数类型是主窗体,当要显示子窗体的时候,就用这个构造函数来...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作