简述

对于任意情况下的蝶形求和,本质上和任意的树形求和是一样的。只需要做逻辑上的抽象,假设那些点存在补全就好了,然后再加一个限定条件就ok了

代码

#include<stdio.h>
#include<string.h>
#include<mpi.h>
#pragma warning(disable : 4996)
#define MAX_STRING 100
using namespace std;
#include <fstream>
#include <iostream>int main(void) {int len;double scalar, local_sum = 0;int comm_sz;int my_rank;int divided_len;int last_divided;int begin_i;int oper_N = 2;MPI_Init(NULL, NULL);MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);// 只有一个线程的时候不操作if (comm_sz <= 1) {MPI_Finalize();return 0;}ifstream cin("D:\\C++\\VS\\repo\\MPI-DEMO\\MPI-DEMO\\input.txt");cin >> len; // 输入数据长度divided_len = len / comm_sz;last_divided = len % comm_sz;if (my_rank < last_divided) {divided_len++;begin_i = my_rank * divided_len;}else {begin_i = (my_rank - last_divided) * divided_len + ((divided_len + 1)* last_divided);}// 局部和for (int i = 0; i < len; ++i) {cin >> scalar;if (i < begin_i || i >= begin_i + divided_len) continue;else {local_sum += scalar;}}// 假设comm_sz不一定是2的幂// 蝶形求和while (oper_N <= comm_sz || (oper_N > comm_sz && oper_N / 2 < comm_sz)) {// 往前发if (my_rank % oper_N < oper_N / 2) {if (my_rank + oper_N / 2 < comm_sz){MPI_Send(&local_sum, 1, MPI_DOUBLE, my_rank + oper_N / 2, 0, MPI_COMM_WORLD);MPI_Recv(&scalar, 1, MPI_DOUBLE, my_rank + oper_N / 2, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);local_sum += scalar;}}// 往后发else if (my_rank % oper_N >= oper_N / 2) {MPI_Send(&local_sum, 1, MPI_DOUBLE, my_rank - oper_N / 2, 0, MPI_COMM_WORLD);MPI_Recv(&scalar, 1, MPI_DOUBLE, my_rank - oper_N / 2, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);local_sum += scalar;}oper_N *= 2;}if (my_rank == 0) {cout << local_sum << endl;}MPI_Finalize();return 0;
}

【MPI编程】任意节点数的蝶形求和(高性能计算)相关推荐

  1. 【MPI编程】矩阵向量乘法--解法二(高性能计算)

    简述 有留心过的朋友可能会发现,其实我没写过解法一. 因为解法一就是大家最直观的感受的一种解法. 将矩阵按照行划分,之后,再每个线程都用整个向量跟这个块做内积.之后,传回来一个数值. 这里的方法二, ...

  2. 【MPI编程】矩阵向量乘法--解法三(子矩阵块分解)【高性能计算】

    简述 子矩阵分解,就是说,将原来的矩阵给分解为更小的矩阵块. 让所有的线程都共享有向量(但不共享矩阵) 为了试验简单,这里做了几个简单的假设 矩阵为方阵(n*n) comm_sz(线程数量)和n满足下 ...

  3. 【MPI编程】任意数节点的树形求和(高性能计算)

    简述 之前写过一个只能在2幂次数的节点环境下使用的树形结构求和 [MPI编程]2幂节点的树形求和(高性能计算) 稍微修改了一下对应代码,就可以使用了.其实就是在逻辑上扩充一下为2的幂数.也就是说接受节 ...

  4. 任意二叉树节点数、度数与叶子数的关系

    二叉树的性质--节点数.度数.叶子节点数的关系 对于任意一棵二叉树,如果2度的节点数有n2个,则叶子数n0必定为n2+1(n0=n2+1) (1) 我们假设有二叉树的枝有B个,如果从下往上思考,可以看 ...

  5. MPI编程及性能优化

    第1节 MPI简介 1.1 MPI及其历史 与OpenMP相似,消息传递接口(Message Passing Interface,简称MPI)是一种编程接口标准,而不是一种具体的编程语言.该标准是由消 ...

  6. 计算神经网络隐藏层节点数极小值

    神经网络的隐藏层的节点数越少网络的速度越快,那么神经网络的隐藏层的节点数是否有一个可以保证性能的极小值,本文用mnist数据集做了实验. 首先制作一个784*n*2的神经网络,用于测试0-9中的任意两 ...

  7. java质因数的分解_Java实现分解任意输入数的质因数算法示例

    本文实例讲述了Java实现分解任意输入数的质因数算法.分享给大家供大家参考,具体如下: 分解任意输入数的质因数: 质因数概念:任何一个合数都可以写成几个质数相乘的形式.其中每个质数都是这个合数的因数, ...

  8. 高性能MPI编程实验

    文章目录 一.实验目的 二.实验要求 三.华为云平台的功能特性和实践关键步骤 四.高性能MPI编程开发关键过程 五.WordCount算法的MPI实现关键点 六.MPI编程与MapReduce的比较分 ...

  9. 分布式系统中一些主要的副本更新策略——Dynamo/Cassandra/Riak同时采取了主从式更新的同步+异步类型,以及任意节点更新的策略。...

    分布式系统中一些主要的副本更新策略. 1.同时更新 类型A:没有任何协议,可能出现多个节点执行顺序交叉导致数据不一致情况. 类型B:通过一致性协议唯一确定不同更新操作的执行顺序,从而保证数据一致性 2 ...

最新文章

  1. 新手友好系列:网页制作这些环节需要着重强调!
  2. linux命令date
  3. docker-部署elk-6.1.3
  4. RabbitMQ简单队列模式
  5. log4jdbc oracle,通过weblogic配置log4jdbc数据源,在项目中使用该数据源,输出sql
  6. byte数组转字符串_leetcode刷题844比较含退格的字符串(带代码解析,带知识点回顾)...
  7. HDU 1561 The more, The Better
  8. Django 学习笔记第一课
  9. 利用python自定义完整版迭代器
  10. jmeter 设置环境变量
  11. python索引字符串_Python:通过索引删除子字符串
  12. 俄罗斯套娃(JOISC 2016 Day 1)
  13. 云服务器软件运行出错,云服务器程序运行中出现木马
  14. selenium python自动化测试 ddt数据驱动
  15. python进行数据抽取_python中的数据抽取
  16. 如何理解js中的this
  17. php中理解print EOT分界符和echo EOT的用法区别
  18. 电路设计中如何解决电压跌落
  19. 图标显示方框问题的一种原因
  20. ASUS华硕天选/天选2P/天选3P/飞行堡垒789/枪神/枪神2/枪神3/枪神4/枪神5P/枪神6P/幻14 FA506 FX506安装原厂Windows10系统原装Windows11出厂系统重装

热门文章

  1. Android构建boot.img(二):kernel的拷贝与打包
  2. WINCE6.0+S3C2443下ADC在电池驱动应用
  3. Firefox无法加载12306自家证书
  4. 矩阵的LU分解 c++
  5. 【java设计模式】之 代理(Proxy)模式
  6. [C#-SQLite] SQLite一些奇怪的问题
  7. Metrics.NET 项目
  8. 请大家访问另一个我的博客!
  9. The DVMM Lab at Columbia University
  10. Java数据结构Map遍历和排序