MPI之虚拟进程拓扑

什么是虚拟进程拓扑

在很多并行应用进程中,进程的线性排列不能充分的反映进程间在逻辑上的通信模型,通常由问题几何和所用的算法决定,进程经常被排列成二维或者三维网络形式的拓扑模型而通常用一个图来描述逻辑进程排列,此种逻辑进程排列为虚拟拓扑。
在这里插入图片描述

拓扑是组内通信域上的额外,可选属性,它不能附加在组间通信域(inter-communcator)上,拓扑能提供一种方便的命名机制,对于由特定拓扑要求的算法使用起来直接自然方便。
在这里插入图片描述

拓扑还可以辅助运行时系统,将进程映射到实际的硬件结构上。

笛卡尔拓扑

MPI 笛卡尔拓扑是一种二维矩形的结构,在这个结构中,每个进程都有一个唯一的坐标。这种拓扑结构通常用于实现多维分布式数组的通讯。

使用 MPI_Cart_create 函数可以创建 Cartesian 拓扑,并使用 MPI_Cart_shift 函数获取进程在对应维度上的相邻进程的 ran

函数原型

int MPI_Cart_create(MPI_Comm old_comm, int ndims, 
const int dims[], const int periods[], int reorder, 
MPI_Comm *comm_cart);

int MPI_Cart_shift(MPI_Comm comm, int direction, int displ, 
int *rank_source, int *rank_dest);

MPI_Cart_create参数详解

  • MPI_Comm old_comm:原通讯域。
  • int ndims:拓扑结构的维度。
  • const int dims[]:每个维度上的进程数量。
  • const int periods[]:每个维度上的边界条件,非零表示周期性边界,零表示非周期性边界。
  • int reorder:是否重新排列原通讯域的进程排列方式。
  • MPI_Comm *comm_cart:新的通讯子,包含 Cartesian 拓扑。

MPI_Cart_shift参数详解

  • MPI_Comm comm:拓扑结构通讯子。
  • int direction:相邻进程的维度。
  • int displ:进程生下的偏移量,一般为 -1 或 1。
  • int *rank_source:源进程的 rank。
  • int *rank_dest:目标进程的 rank。

代码实例

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

int main(int argc, char* argv[]) {
    int rank, size;
    MPI_Comm comm_cart;
    int dims[2], periods[2], coords[2], reorder;

    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    // 确定每个维度的大小
    dims[0] = dims[1] = 0;
    MPI_Dims_create(size, 2, dims);

    // 设置周期性边界条件
    periods[0] = periods[1] = 1;
    reorder = 1;
    MPI_Cart_create(MPI_COMM_WORLD, 2, dims, periods, reorder, &comm_cart);

    // 获取当前进程在 Cartesian 拓扑中的坐标
    MPI_Comm_rank(comm_cart, &rank);
    MPI_Cart_coords(comm_cart, rank, 2, coords);
    printf("Rank %d:\tCoords = (%d, %d)\n", rank, coords[0], coords[1]);

    // 获取当前进程在 x 方向上相邻进程的 rank
    int left, right;
    MPI_Cart_shift(comm_cart, 0, 1, &left, &right);
    printf("Rank %d:\tLeft = %d, Right = %d\n", rank, left, right);

    // 获取当前进程在 y 方向上相邻进程的 rank
    int up, down;
    MPI_Cart_shift(comm_cart, 1, 1, &up, &down);
    printf("Rank %d:\tUp = %d, Down = %d\n", rank, up, down);

    MPI_Finalize();
    return 0;

使用 MPI_Cart_create 函数创建了 Cartesian 拓扑,然后使用 MPI_Cart_coords 函数获取一个进程在 Cartesian 拓扑中的坐标。最后,使用 MPI_Cart_shift 函数获取相邻进程在 Cartesian 拓扑中的 rank。

在本示例中,我们假设拓扑是一个二维矩形,因此我们使用 MPI_Dims_create 函数以及维度数量和进程总数来计算每个维度的大小。我们还将 periods 数组设置为 {1,1},表示在每个维度的两端都设置周期性边界条件。我们还把 reorder 参数设置为 1,以便 MPI 能够以最优方式映射进程到拓扑结构中。

使用 MPI_Cart_create 函数,我们创建了一个通讯子,该子进程具有 Cartesian 拓扑。接着使用 MPI_Cart_shift 函数,以获取当前进程在 x 和 y 方向上相邻进程的 rank。

扩展:

  1. 一维拓扑结构(一维链状结构)

    • 每个进程只有一个相邻进程。
    • 使用 MPI_Comm_split 函数创建。
  2. 多维拓扑结构

    • 每个进程有多个相邻进程。
    • 使用 MPI_Cart_create 函数创建。
  3. 自定义拓扑结构

    • 可以通过 MPI_Comm_create 函数创建自定义拓扑结构,满足特定应用场景的需求。

代码用例来自网络,仅供参考扫盲学习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot入门篇3 - 整合junit、整合mybatis、基于SpringBoot实现ssm整合

目录 1.整合JUnit Spring整合JUnit SpringBoot整合JUnit 测试类注解&#xff1a;SpringBootTest 作用&#xff1a;设置JUnit加载的SpringBoot启动类 2.整合mybatis ①使用spring initializr初始化项目的时候&#xff0c;添加依赖。 ②设置数据源application.yml spring:d…

第 112 场 LeetCode 双周赛题解

A 判断通过操作能否让字符串相等 I s 1 s1 s1和 s 2 s2 s2第 1 1 1、 2 2 2位若同位置不等&#xff0c;则 s 1 s1 s1交换对应的 i i i和 j j j位置&#xff0c;之后判断 s 1 s1 s1和 s 2 s2 s2是否相当 class Solution { public:bool canBeEqual(string s1, string s2) {for (i…

低代码与低代码平台的概念解析

随着数字化转型和软件需求的不断增长&#xff0c;传统的手写代码开发方式已经无法满足迅速推出应用程序的需求。为了加快软件开发的速度并降低技术门槛&#xff0c;低代码开发模式应运而生。本文将介绍低代码的概念&#xff0c;探讨什么是低代码什么是低代码平台&#xff1f; 一…

8.react18并发模式与startTransition(搜索高亮思路)

React 18 之前,渲染是一个单一的,不间断的,同步的事务,一旦渲染开始,就不能被中断 React 18引入并发模式,它允许你将标记更新作为一个transitions,这会告诉React他们可以被中断执行.这样可以将紧急任务先更新,不紧急任务后更新. 将任务给紧急任务先执行, 优先级低的任务后执行…

JavaScript原型链污染

JavaScript原型链污染 一、什么是原型链污染(JS)二、前置知识2.1 JS对象2.11 通过类创建2.12 字面量模式创建2.13构造函数模式创建 2.2 默认属性 三、污染利用 一、什么是原型链污染(JS) 原型链污染&#xff08;Prototype Pollution&#xff09;是一种安全漏洞&#xff0c;在 …

零基础搭建个人影音媒体平台,实现远程访问Jellyfin播放器的简易方法

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

VBA中如何将if写到一行

在VBA中&#xff0c;可以使用以下两种方式来编写一行if语句&#xff1a; 使用三元运算符&#xff1a; Dim result As String result "Yes" If True Else "No"在这个例子中&#xff0c;如果条件为真&#xff0c;则result变量的值为"Yes"&#…

抖音小程序开发教学系列(1)- 抖音小程序简介

章节一&#xff1a;抖音小程序简介 1.1 抖音小程序的背景和概述 抖音小程序的发展背景和市场趋势&#xff1a; 抖音作为一款热门的短视频社交平台&#xff0c;用户群体庞大&#xff0c;社交共享的特性也为小程序的发展提供了广阔的空间。抖音小程序作为抖音在社交和用户粘性…

质谱技术对蛋白质进行鉴定

参考B站教学视频: 质谱如何鉴定蛋白质_哔哩哔哩_bilibili 针对该视频&#xff0c;别人的 笔记 质谱是一台体重秤&#xff0c;称的不是人&#xff0c;而是分子、原子的体重 不同分子有不同分子量是质谱仪工作的底层逻辑 图片来自&#xff1a;【蛋白组】蛋白质组定量技术的原理和…

HTML+JavaScript+CSS DIY 分隔条splitter

一、需求分析 现在电脑的屏幕越来越大&#xff0c;为了利用好宽屏&#xff0c;我们在设计系统UI时喜欢在左侧放个菜单或选项面板&#xff0c;在右边显示与菜单或选项对应的内容&#xff0c;两者之间用分隔条splitter来间隔&#xff0c;并可以通过拖动分隔条splitter来动态调研…

GaussDB数据库SQL系列-行列转换

一、前言 二、简述 1、行转列概念 2、列转行概念 三、GaussDB数据库的行列转行实验示例 1、行转列示例 1&#xff09;创建实验表&#xff08;行存表&#xff09; 2&#xff09;静态行转列 3&#xff09;行转列&#xff08;结果值&#xff1a;拼接式&#xff09; 4&…

maven部署

一、下载Maven 地址&#xff1a;Maven – Download Apache Maven 二、解压缩&#xff0c;设置环境变量 tar -xvf apache-maven-3.8.8-bin.tar.gz export MAVEN_HOME/opt/apache-maven-3.8.8 export PATH$MAVEN_HOME/bin:$PATH echo $MAVEN_HOME echo $PATH mvn -v

Android AGP版本

做个记录&#xff1a; Android AGP版本 https://developer.android.com/studio/releases/gradle-plugin?hlzh-cn

mac idea启动没反应 无法启动

遇到的问题如下&#xff1a; 启动idea&#xff0c;没反应 无法启动&#xff0c;不论破解还是别的原因&#xff0c;总之无法启动了 应用程序–找到idea–右击显示包内容–Contents–MacOS–打开idea 弹出框提示如下&#xff1a; 双击这个idea可执行文件 1&#xff09;先查看日志…

Kafka3.0.0版本——Leader故障处理细节原理

目录 一、服务器信息二、服务器基本信息及相关概念2.1、服务器基本信息2.2、LEO的概念2.3、HW的概念 三、Leader故障处理细节 一、服务器信息 三台服务器 原始服务器名称原始服务器ip节点centos7虚拟机1192.168.136.27broker0centos7虚拟机2192.168.136.28broker1centos7虚拟机…

docker安装grafana,prometheus,exporter以及springboot整合详细教程(GPE)

springboot项目ip:192.168.168.1 测试服务器ip:192.168.168.81 文章来自互联网,自己略微整理下,更容易上手,方便自己,方便大家 最终效果: node springboot 1.下载镜像 docker pull prom/node-exporter docker pull prom/mysqld-exporter docker pull google/cadvisor dock…

「黄钊的AI日报·第一季」免费试读!最后5天,早鸟价60元~

1、每天5条AI内容点&#xff1a;不是常见的新闻汇总模式&#xff0c;而是站在AI产品经理的视角&#xff0c;把每篇AI干货的最核心内容&#xff0c;直接拎出来、甚至用自己的话来描述&#xff0c;是在展示“what I see”&#xff0c;和原文已经不是一个东西了&#xff01; 2、已…

MIT6.824 Spring2021 Lab 1: MapReduce

文章目录 0x00 准备0x01 MapReduce简介0x02 RPC0x03 调试0x04 代码coordinator.gorpc.goworker.go 0x00 准备 阅读MapReduce论文配置GO环境 因为之前没用过GO,所以 先在网上学了一下语法A Tour of Go 感觉Go的接口和方法的语法和C挺不一样, 并发编程也挺有意思 0x01 MapRed…

OpenAI推出ChatGPT企业版,提供更高安全和隐私保障

&#x1f989; AI新闻 &#x1f680; OpenAI推出ChatGPT企业版&#xff0c;提供更高安全和隐私保障 摘要&#xff1a;OpenAI发布了面向企业用户的ChatGPT企业版&#xff0c;用户可以无限制地访问强大的GPT-4模型&#xff0c;进行更深入的数据分析&#xff0c;并且拥有完全控制…

如何使用 Amazon EMR 在 Amazon EKS 上构建可靠、高效、用户友好的 Spark 平台

这是 SafeGraph 技术主管经理 Nan Zhu 与亚马逊云科技高级解决方案架构师 Dave Thibault 共同撰写的特约文章。 SafeGraph 是一家地理空间数据公司&#xff0c;管理着全球超过 4100 万个兴趣点&#xff08;POI&#xff0c;Point of Interest&#xff09;&#xff0c;提供品牌隶…