網(wǎng)站首頁 編程語言 正文
一、傳播者
本章中的所有示例僅使用一個(gè)連接所有進(jìn)程的通信器。但是,可以創(chuàng)建更多的通信器來鏈接進(jìn)程的子集。這對于不需要由所有進(jìn)程執(zhí)行的集體操作特別有用。
二、示例和代碼
示例 47.15。使用多個(gè)通信器
#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 使用函數(shù) boost::mpi::broadcast()。此函數(shù)發(fā)送字符串“Hello, world!”從等級為 0 的進(jìn)程到鏈接到本地??通信器的所有進(jìn)程。等級為 0 的進(jìn)程也必須鏈接到該通信器。
本地通信器是通過調(diào)用 split() 創(chuàng)建的。 split() 是在全局通信器世界上調(diào)用的成員函數(shù)。 split() 需要一個(gè)整數(shù)來將進(jìn)程鏈接在一起。將相同整數(shù)傳遞給 split() 的所有進(jìn)程都鏈接到相同的通信器。傳遞給 split() 的整數(shù)值無關(guān)緊要。重要的是應(yīng)該由特定通信器鏈接的所有進(jìn)程都傳遞相同的值。
在示例 47.15 中,等級為 0 和 1 的兩個(gè)進(jìn)程將 99 傳遞給 split()。如果程序啟動時(shí)有兩個(gè)以上的進(jìn)程,則額外的進(jìn)程會傳遞 100。這意味著前兩個(gè)進(jìn)程有一個(gè)本地通信器,所有其他進(jìn)程都有另一個(gè)本地通信器。每個(gè)進(jìn)程都鏈接到 split() 返回的通信器。是否有其他進(jìn)程鏈接到同一個(gè)通信器取決于其他進(jìn)程是否將相同的整數(shù)傳遞給 split()。
請注意,等級始終與傳播者有關(guān)。最低等級始終為 0。在示例 47.15 中,相對于全局通信器具有等級 0 的進(jìn)程相對于其本地通信器也具有等級 0。相對于全局通信器具有等級 2 的進(jìn)程相對于其本地通信器具有等級 0。
如果您使用兩個(gè)或更多進(jìn)程啟動示例 47.15,您好,世界!將顯示兩次 - 每次由相對于全局通信器的等級為 0 和 1 的進(jìn)程顯示一次。因?yàn)?s 設(shè)置為“Hello, world!”僅在全局等級為 0 的進(jìn)程中,此字符串僅通過通信器發(fā)送到鏈接到同一通信器的那些進(jìn)程。這只是具有全局排名 1 的進(jìn)程,這是唯一將 99 傳遞給 split() 的其他進(jìn)程。
示例 47.16。使用組對流程進(jìn)行分組
#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 支持分組進(jìn)程。這是在類 boost::mpi::group 的幫助下完成的。如果您在通信器上調(diào)用成員函數(shù) group(),則鏈接到通信器的所有進(jìn)程都將在類型為 boost::mpi::group 的對象中返回。您不能使用此對象進(jìn)行通信。它只能用于形成一組新的進(jìn)程,然后可以從中創(chuàng)建通信器。
boost::mpi::group 提供成員函數(shù),如 include() 和 exclude()。您傳遞迭代器以包含或排除進(jìn)程。 include() 和 exclude() 返回一個(gè)類型為 boost::mpi::group 的新組。
示例 47.16 將兩個(gè)迭代器傳遞給 exclude(),它們引用類型為 boost::integer_range 的對象。該對象表示一個(gè)整數(shù)范圍。它是在函數(shù) boost::irange() 的幫助下創(chuàng)建的,它需要一個(gè)下限和上限。上限是一個(gè)不屬于該范圍的整數(shù)。在此示例中,這意味著 r 僅包含整數(shù) 0。
調(diào)用 exclude() 會導(dǎo)致創(chuàng)建子組,其中包含除等級為 0 的進(jìn)程之外的所有進(jìn)程。然后使用該組創(chuàng)建一個(gè)新的通信器 others。這是通過將全局通信器世界和子組傳遞給 boost::mpi::communicator 的構(gòu)造函數(shù)來完成的。
請注意,others 是一個(gè) communicator,它在 rank 0 的進(jìn)程中是空的。rank 0 的進(jìn)程沒有鏈接到這個(gè) communicator,但是變量 others 仍然存在于這個(gè)進(jìn)程中。您必須注意不要在此過程中使用其他人。示例 47.16 通過在子組上調(diào)用 rank() 來防止這種情況。成員函數(shù)在不屬于該組的進(jìn)程中返回一個(gè)類型為 boost::optional 的空對象。其他進(jìn)程接收它們相對于該組的等級。
如果 rank() 返回排名并且沒有類型為 boost::optional 的空對象,則調(diào)用 boost::mpi::broadcast()。等級為 0 的進(jìn)程發(fā)送字符串“Hello, world!”鏈接到其他通信器的所有進(jìn)程。請注意,等級是相對于那個(gè)傳播者的。相對于其他進(jìn)程排名為 0 的進(jìn)程相對于全球通信者世界排名為 1。
如果您使用兩個(gè)以上的進(jìn)程運(yùn)行示例 47.16,則全局等級大于 0 的所有進(jìn)程都將顯示 Hello, world!。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127942024
相關(guān)推薦
- 2022-09-08 Python數(shù)據(jù)分析基礎(chǔ)之異常值檢測和處理方式_python
- 2022-11-08 hooks中useEffect()使用案例詳解_React
- 2022-07-20 C語言詳細(xì)實(shí)現(xiàn)猜拳游戲流程_C 語言
- 2022-07-06 python如何實(shí)現(xiàn)質(zhì)數(shù)求和_python
- 2022-06-21 C語言實(shí)現(xiàn)順序表的全操作詳解_C 語言
- 2023-09-12 linux配置固定ip
- 2022-04-09 WPF中的數(shù)據(jù)模板用法介紹_基礎(chǔ)應(yīng)用
- 2022-05-08 jquery實(shí)現(xiàn)淘寶詳情頁選擇套餐_jquery
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支