当前位置: 首页 > news >正文

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 方向上相邻进程的 rankint left, right;MPI_Cart_shift(comm_cart, 0, 1, &left, &right);printf("Rank %d:\tLeft = %d, Right = %d\n", rank, left, right);// 获取当前进程在 y 方向上相邻进程的 rankint 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 函数创建自定义拓扑结构,满足特定应用场景的需求。

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

http://www.lryc.cn/news/152718.html

相关文章:

  • Three.js相机参数及Z-Fighting问题的解决方案
  • 微信小程序食疗微信小程序的设计与实现
  • mac环境使用pkgbuild命令打pkg包的几个小细节
  • 在 Spring Boot 中集成 MinIO 对象存储
  • seq2seq与引入注意力机制的seq2seq
  • 【zookeeper】zookeeper介绍
  • 2023高教社杯数学建模思路 - 案例:ID3-决策树分类算法
  • springboot docker
  • docker-compose 部署nacos 整合 postgresql 为DB
  • 详解 ElasticSearch Kibana 配置部署
  • SourceTree 使用技巧
  • VIRTIO-BLK代码分析(0)概述
  • 【2023年11月第四版教材】第10章《进度管理》(第一部分)
  • 【多线程案例】生产者消费者模型(堵塞队列)
  • 数据结构与算法基础-学习-30-插入排序之直接插入排序、二分插入排序、希尔排序
  • Qt+C++桌面计算器源码
  • kubesphere安装Maven+JDK17 流水线打包
  • 百度搜索清理大量低质量网站
  • WPF数据模板
  • 浙江绿农环境:将废弃矿山变耕地,为生态文明贡献力量
  • HTML/CSS盒子模型
  • 《Java面向对象程序设计》学习笔记——CSV文件的读写与处理
  • opencv 案例05-基于二值图像分析(简单缺陷检测)
  • Elasticsearch入门介绍
  • QML Book 学习基础3(动画)
  • Lesson4-3:OpenCV图像特征提取与描述---SIFT/SURF算法
  • 语言基础篇9——Python流程控制
  • MATLAB算法实战应用案例精讲-【概念篇】构建数据指标方法(补充篇)
  • 【pyqt5界面化工具开发-12】QtDesigner图形化界面设计
  • CXL.mem S2M Message 释义