使用 MPI 做 3D 带状矩阵的转置

目的:整个大矩阵从 [Nx, Ny, Nz] 转到 [Nz, Nx, Ny]

每个进程的输入:大矩阵的 [Nx / total_proc_num, Ny, Nz] 的部分

每个进程的输出:大矩阵的 [Nz / total_proc_num, Nx, Ny] 的部分

一开始我大概有一个想法,假设两个进程的话,就把整个大矩阵分成 4 * 4 的块,进行分配,但是我不知道怎么分,就算是把转置之前的数据分布和转置之后的数据分布写出来了,也似乎找不到规律。

我做的图

xyz

在这里插入图片描述

zxy

在这里插入图片描述

后面通过 chatgpt 做出来了

#include <algorithm>
#include <iostream>
#include <mpi.h>
#include <vector>void transpose_3d_block(int* local_A, int* local_A_T, int local_nx, int Ny, int Nz)
{for (int i = 0; i < local_nx; ++i){for (int j = 0; j < Ny; ++j){for (int k = 0; k < Nz; ++k){local_A_T[k * local_nx * Ny + i * Ny + j] = local_A[i * Ny * Nz + j * Nz + k];}}}
}int main(int argc, char** argv)
{MPI_Init(&argc, &argv);int rank, size;MPI_Comm_rank(MPI_COMM_WORLD, &rank);MPI_Comm_size(MPI_COMM_WORLD, &size);// 矩阵维度const int Nx = 4, Ny = 6, Nz = 8;const int local_nx     = Nx / size;const int new_local_nx = Nz / size;// 创建局部数据块std::vector<int> local_A(local_nx * Ny * Nz);std::vector<int> local_A_T(new_local_nx * Nx * Ny);// 初始化矩阵,仅在主进程上进行if (rank == 0){std::vector<int> A(Nx * Ny * Nz);for (int i = 0; i < Nx * Ny * Nz; ++i){A[i] = i;}// 分割矩阵到各个进程for (int i = 0; i < size; ++i){if (i == 0){std::copy(A.begin(), A.begin() + local_nx * Ny * Nz, local_A.begin());}else{MPI_Send(A.data() + i * local_nx * Ny * Nz, local_nx * Ny * Nz, MPI_INT, i, 0, MPI_COMM_WORLD);}}}else{MPI_Recv(local_A.data(), local_nx * Ny * Nz, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);}// 局部转置 (local_nx, Ny, Nz) -> (Nz, local_nx, Ny)transpose_3d_block(local_A.data(), local_A_T.data(), local_nx, Ny, Nz);// 准备交换数据std::vector<int> send_data(local_A_T);std::vector<int> recv_data(send_data.size());// 交换数据MPI_Alltoall(send_data.data(),new_local_nx * local_nx * Ny,MPI_INT,recv_data.data(),new_local_nx * local_nx * Ny,MPI_INT,MPI_COMM_WORLD);// 重组数据到local_resultstd::vector<int> local_result(new_local_nx * Nx * Ny);for (int i = 0; i < size; ++i){for (int j = 0; j < new_local_nx; ++j){std::copy(recv_data.begin() + (i * new_local_nx + j) * local_nx * Ny,recv_data.begin() + (i * new_local_nx + j + 1) * local_nx * Ny,local_result.begin() + j * Nx * Ny + i * local_nx * Ny);}}// 输出转置结果,仅在主进程上进行检查if (rank == 0){std::vector<int> A_T(Nz * Nx * Ny);std::copy(local_result.begin(), local_result.begin() + new_local_nx * Nx * Ny, A_T.begin());for (int i = 1; i < size; ++i){MPI_Recv(A_T.data() + i * new_local_nx * Nx * Ny,new_local_nx * Nx * Ny,MPI_INT,i,0,MPI_COMM_WORLD,MPI_STATUS_IGNORE);}std::cout << "Transposed matrix A_T:" << std::endl;for (int i = 0; i < Nz; ++i){for (int j = 0; j < Nx; ++j){for (int k = 0; k < Ny; ++k){std::cout << A_T[i * Nx * Ny + j * Ny + k] << " ";}std::cout << std::endl;}std::cout << std::endl;}}else{MPI_Send(local_result.data(), new_local_nx * Nx * Ny, MPI_INT, 0, 0, MPI_COMM_WORLD);}MPI_Finalize();return 0;
}

输出:

Transposed matrix A_T:
0 8 16 24 32 40 
48 56 64 72 80 88 
96 104 112 120 128 136 
144 152 160 168 176 184 1 9 17 25 33 41 
49 57 65 73 81 89 
97 105 113 121 129 137 
145 153 161 169 177 185 2 10 18 26 34 42 
50 58 66 74 82 90 
98 106 114 122 130 138 
146 154 162 170 178 186 3 11 19 27 35 43 
51 59 67 75 83 91 
99 107 115 123 131 139 
147 155 163 171 179 187 4 12 20 28 36 44 
52 60 68 76 84 92 
100 108 116 124 132 140 
148 156 164 172 180 188 5 13 21 29 37 45 
53 61 69 77 85 93 
101 109 117 125 133 141 
149 157 165 173 181 189 6 14 22 30 38 46 
54 62 70 78 86 94 
102 110 118 126 134 142 
150 158 166 174 182 190 7 15 23 31 39 47 
55 63 71 79 87 95 
103 111 119 127 135 143 
151 159 167 175 183 191

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTTP 请求的完整过程

HTTP 请求的完整过程 当用户在浏览器输入网址回车之后&#xff0c;网络协议都做了哪些工作呢? 首先工作的是 浏览器应用程序&#xff0c;他要解析出 URL中的域名 根据域名获取对应的ip地址&#xff0c;首先从浏览器缓存中査看&#xff0c;如下可以査看浏览器中域名对应ip的解…

想当安卓开发工程师?学习路线分享!

安卓开发学习路线 在前几篇文章中,对安卓开发岗位的岗位要求做了一些科普,本节文章将介绍安卓开发岗位的学习路线。 目前,网络上有很多面经、算法题解、算法课等学习资料,如何合理利用这些资料成为技术求职者的一大困惑。笔者整理了一份安卓开发岗位学习路线供大家参考,…

两篇文章讲透数据结构之堆(一)!

目录 1.堆的概念 2.堆的实现方式 3.堆的功能 4.堆的声明 5.堆的实现 5.1堆的初始化 5.2堆的插入 5.2.1向上调整算法 5.2.2堆的插入 5.3堆的删除 5.3.1向下调整算法 5.3.2堆的删除 5.4获取堆顶元素 5.5获取堆的元素个数 5.6判断堆是否为空 5.7打印堆 5.8建堆 …

亚马逊自养号测评环境搭建技巧:打造防关联底层环境的关键步骤

今天我们要聊的是完全由人工操作的自养号方法&#xff0c;相信有过相关经验的朋友们都清楚&#xff0c;在实现自养号的过程中&#xff0c;所使用的 IP 和浏览器究竟有哪些选择&#xff0c;以及可能会遇到哪些问题。 首先&#xff0c;我们来看看市场上现有的 IP 类型以及可能出现…

[LDAP: error code 34 - invalid DN]

目前我的项目版本&#xff1a; Spring版本:5.3.15SpringBoot版本:2.6.3 完整错误 org.springframework.ldap.InvalidNameException: [LDAP: error code 34 - invalid DN]; nested exception is javax.naming.InvalidNameException: [LDAP: error code 34 - invalid DN]at org.s…

zabbix实现企业微信机器人推送

0、前置条件 已经申请到企业微信机器人webhook&#xff0c;参考链接https://developer.work.weixin.qq.com/document/path/91770 1、创建报警媒介类型 在报警媒介类型右上角创建媒体类型 新增Token参数&#xff0c;将申请获得的Token填入 在脚本处填入脚本&#xff1a; 脚…

amtlib.dll打不开怎么办?一键修复丢失amtlib.dll方法

电脑丢失amtlib.dll文件是什么情况&#xff1f;出现amtlib.dll打不开怎么办&#xff1f;这样的情况有什么解决方法呢&#xff1f;今天就和大家聊聊amtlib.dll文件同时教大家一键修复丢失amtlib.dll方法&#xff1f;一起来看看amtlib.dll文件丢失会有哪些方法修复&#xff1f; a…

从旅游广告联想到《桃花源记》

近日收到《长江头条网》等知名网络自媒体相邀,促我写点儿旅游题材的文案。虽说笔者游历过许多名山大川的绝美风景区,但那是在70岁之前的事儿了。如今年逾78岁,纵使有少许自有资本能够支持出游,可体力难撑,岂不是花钱买罪受吗?而且,写没有亲身经历过的事挺难,即便发表出…

leetCode-hot100-数组专题之双指针

数组双指针专题 1.同向双指针1.1例题26.删除有序数组中的重复项27.移除元素80.删除有序数组中的重复项 Ⅱ 2.相向双指针2.1例题11.盛最多水的容器42.接雨水581.最短无序连续子数组 双指针在算法题中很常见&#xff0c;下面总结双指针在数组中的一些应用&#xff0c;主要分为两类…

WebGL的医学培训软件开发

开发基于WebGL的医学培训软件是一项复杂且技术性强的任务&#xff0c;需要结合医学专业知识和计算机图形学技术。以下是详细的开发流程和关键步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析与定义 目标用户&#xf…

二叉树——进阶(递归创建,非递归,广度优先,翻转,深度,对称)

二叉树——进阶 二叉树的递归创建非递归前中后序遍历非递归前序遍历非递归中序遍历非递归后序遍历 广度优先遍历二叉树&#xff08;层序遍历&#xff09;翻转二叉树 二叉树深度最大深度最小深度 对称二叉树 二叉树的递归创建 1&#xff0c;二叉树是一种结构相对固定的数据&…

vue3中element-plus下拉菜单与图标的使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

用Python一键生成PNG图片的PowerPoint幻灯片

在当今的商业环境中,PowerPoint演示是展示和传递信息的常用方式。然而,手动将大量图像插入到幻灯片中往往是一项乏味且耗时的工作。但是,通过Python编程,我们可以轻松自动化这个过程,节省时间和精力。 C:\pythoncode\new\folderTOppt.py 在本文中,我将介绍如何使用Python、wx…

【C++初阶】vector

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

在winnas中使用docker desktop遇到的问题及解决方法记录

最近在尝试从群晖转向winnas&#xff0c;一些简单的服务依然计划使用docker来部署。群晖的docker简单易用且稳定&#xff0c;在win上使用docker desktop过程中遇到了不少问题&#xff0c;在此记录一下以供后来人参考。 一、安装docker desktop后启动时遇到无法启动docker引擎 …

【Unity AR开发插件】四、制作热更数据-AR图片识别场景

专栏 本专栏将介绍如何使用这个支持热更的AR开发插件&#xff0c;快速地开发AR应用。 链接&#xff1a; Unity开发AR系列 插件简介 通过热更技术实现动态地加载AR场景&#xff0c;简化了AR开发流程&#xff0c;让用户可更多地关注Unity场景内容的制作。 “EnvInstaller…”支…

2024年电工杯数学建模竞赛A题完整解析 | 代码 论文分享

A 题 问题一1.1问题分析1.2第一问1.2.1指标定义1.2.2结果计算1.2.3关键因素分析 1.3第二问1.3.1模型建立1.3.2算法求解1.3.3求解结果 1.4第三问1.4.1模型建立1.4.2计算结果 第二题2.1 问题分析2.2第一问2.2.1指标计算 数据与代码代码分享完整资料 A题的问题一和问题二终于完成啦…

vue 纵向滚动菜单, 点击滚动到选中菜单

1 背景 需要设计一个纵向滚动菜单&#xff0c;要求丝滑点&#xff0c;默认显示选中菜单 2 思路 给定一个容器&#xff0c;样式包含overflow:hidden&#xff0c;默认高宽足够显示一个菜单&#xff08;以下用图标代替菜单&#xff09;&#xff0c;鼠标悬浮时增大容器高度&#…

电能抄表是什么?

1.电能抄表的概念和功能 电能抄表&#xff0c;说白了&#xff0c;是一种用于数据记录载入电力工程使用量的机器。它主要职能精确测量做好记录客户在一定时间内的耗电量&#xff0c;为供电公司提供准确的收费根据。电能抄表的应用&#xff0c;不仅方便了电费的清算&#xff0c;…

NSSCTF | [SWPUCTF 2021 新生赛]no_wakeup

打开题目后&#xff0c;点击三个&#xff1f;&#xff0c;发现是一个php序列化脚本 <?phpheader("Content-type:text/html;charsetutf-8"); error_reporting(0); show_source("class.php");class HaHaHa{public $admin;public $passwd;public function…