简述

假设,调用的节点数量整除向量的秩。

高性能算法

让0节点来读取文件数据
所有的节点都负责计算,然后,这里使用的是块分配法。
其他的都是接受到数据之后,再进行计算。
而0节点由于需要负责传输和调度,所以它会在发送数据之后,再进行计算本地的块。之后,再来接受和保存数据。

运行效果

输入的数据为:

10
1 2 3 4 5 6 7 8 9 10
2 3 4 5 6 7 8 9 10 11
8

代码

#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 Find_bin(double x, double *bin_maxes, int bin_count) {for (int i = 0; i < bin_count; ++i) {if (x < bin_maxes[i]) return i;}return bin_count; // 越界
}int main(void) {double *local_vec1, *local_vec2;int len;double scalar, local_sum = 0;int comm_sz;int my_rank;int divided_len;MPI_Init(NULL, NULL);MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);// 假设 n % comm_sz = 0 整除// 只有一个线程的时候不操作if (comm_sz <= 1) {MPI_Finalize();return 0;}if (my_rank == 0) {ifstream cin("D:\\C++\\VS\\repo\\MPI-DEMO\\MPI-DEMO\\input.txt");cin >> len; // 输入数据长度local_vec1 = new double[len];local_vec2 = new double[len];for (int i = 0; i < len; ++i) cin >> local_vec1[i];for (int i = 0; i < len; ++i) cin >> local_vec2[i];cin >> scalar;divided_len = len / comm_sz; double * sub_vec = new double[divided_len];// 发送子串长度for (int i = 1; i < comm_sz; ++i) {MPI_Send(&divided_len, 1, MPI_INT, i, 3, MPI_COMM_WORLD);}// 发送第一个串int target = 1;for (int i = divided_len; i < len; i += divided_len) {for (int j = 0; j < divided_len; ++j) {sub_vec[j] = local_vec1[j + i];}MPI_Send(sub_vec, divided_len, MPI_DOUBLE, target, 0, MPI_COMM_WORLD);target++;}// 发送第二个串target = 1;for (int i = divided_len; i < len; i += divided_len) {for (int j = 0; j < divided_len; ++j) {sub_vec[j] = local_vec2[j + i];}MPI_Send(sub_vec, divided_len, MPI_DOUBLE, target, 1, MPI_COMM_WORLD);target++;}// 发送因子for (int i = 1; i < target; ++i) {MPI_Send(&scalar, 1, MPI_DOUBLE, i, 2, MPI_COMM_WORLD);}// 计算本地的数据for (int i = 0; i < divided_len; ++i) {local_sum += (local_vec1[i] * local_vec2[i]);local_vec1[i] *= scalar;local_vec2[i] *= scalar;}// 接受第一个串target = 1;for (int i = divided_len; i < len; i += divided_len) {MPI_Recv(sub_vec, divided_len, MPI_DOUBLE, target, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);for (int j = 0; j < divided_len; ++j) {local_vec1[j + i] = sub_vec[j];}target++;}// 接受第二个串target = 1;for (int i = divided_len; i < len; i += divided_len) {MPI_Recv(sub_vec, divided_len, MPI_DOUBLE, target, 1, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);for (int j = 0; j < divided_len; ++j) {local_vec2[j + i] = sub_vec[j];}target++;}// 接受部分和for (int i = 1; i < target; ++i) {MPI_Recv(&scalar, 1, MPI_DOUBLE, i, 2, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);local_sum += scalar;}// 输出for (int i = 0; i < len; ++i) {cout << local_vec1[i] << " ";}cout << endl;for (int i = 0; i < len; ++i) {cout << local_vec2[i] << " ";}cout << endl;cout << local_sum << endl;delete[] sub_vec;delete[] local_vec1;delete[] local_vec2;} // 运算的子节点else {MPI_Recv(&divided_len, 1, MPI_INT, 0, 3, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);local_vec1 = new double[divided_len];local_vec2 = new double[divided_len];MPI_Recv(local_vec1, divided_len, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);MPI_Recv(local_vec2, divided_len, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);MPI_Recv(&scalar, 1, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD, MPI_STATUSES_IGNORE);for (int i = 0; i < divided_len; ++i){local_sum += local_vec1[i] * local_vec2[i];local_vec1[i] *= scalar;local_vec2[i] *= scalar;}MPI_Send(local_vec1, divided_len, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD);MPI_Send(local_vec2, divided_len, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD);MPI_Send(&local_sum, 1, MPI_DOUBLE, 0, 2, MPI_COMM_WORLD);delete[] local_vec1;delete[] local_vec2;}MPI_Finalize();return 0;
}

【MPI程序】向量乘法,向量点积(高性能计算)相关推荐

  1. 电子计算机应用地质地貌,岩土基础整理 一、高数24 1、空间解析几何与向量代数 两点间的距离,向量数量积,向量向量积,平面方程,两平面夹角,点到平面的距离,点... - 雪球...

    来源:雪球App,作者: 超级奶爸xujunhorse,(https://xueqiu.com/3442498082/131579485) 一.高数24 1.空间解析几何与向量代数 两点间的距离,向量 ...

  2. 用gdb调试mpi程序的一些心得

    Linux下MPI (Message Passage Interface) 的程序不太好调试,在windows下vs2005以上的IDE有集成的简便MPI调试工具,没有用过,有兴趣的可以试验一下.下面 ...

  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1108:向量点积计算

    时间限制: 1000 ms 内存限制: 65536 KB 提交数: 6036 通过数: 4909 [题目描述] 在线性代数.计算几何中,向量点积是一种十分重要的运算. 给定两个n维向量a=(a1,a2 ...

  4. matlab中向量norm,【Matlab开发】matlab中norm范数以及向量点积、绘图设置相关

    [Matlab开发]matlab中norm范数以及向量点积.绘图设置相关 标签(空格分隔): [Matlab开发] 声明:引用请注明出处外链网址已屏蔽 norm范数使用 help norm norm ...

  5. 数学狂想曲(三)——统计杂谈, PID算法, 20世纪10大算法, 矩阵向量的积

    http://antkillerfarm.github.io/ 统计杂谈 统计模拟 统计模拟是数理统计中非常有用的工具之一, 它是利用计算机产生某概率模型的随机数,再通过这些随机数来模拟真实模型. 这 ...

  6. 向量数量积公式_多法 | 向量数量积相关最值问题的常见处理方法

    近日QQ群更新的部分内容如下高中11大类86个易错点全梳理(185页Word)恒成立涉及10大类40小类题型梳理(100页Word)高中数学10大专题100个考点配例题全梳理2020高考真题分类汇编理 ...

  7. 1.6编程基础之一维数组_09向量点积计算

    http://noi.openjudge.cn/ch0106/09/ /* 1.6编程基础之一维数组_09向量点积计算--AC http://noi.openjudge.cn/ch0106/09/ * ...

  8. 信息学奥赛一本通 1108:向量点积计算 | OpenJudge NOI 1.6 09

    [题目链接] ybt 1108:向量点积计算 OpenJudge NOI 1.6 09:向量点积计算 [题目考点] 1. 数组 [题解代码] 解法1: #include <bits/stdc++ ...

  9. 信息学奥赛一本通(1108:向量点积计算)

    1108:向量点积计算 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 22720     通过数: 17933 [题目描述] 在线性代数.计算几何中,向量点积是一 ...

  10. MPI程序例子 test_8_1_2.c -- 对等模式的MPI程序,Jacobi迭代 (MPI_Send、MPI_Recv)

    NOTE: 这里首先需要弄明白 Jacobi迭代是做什么的,怎么操作. 网上找到的一篇讲解使用 MPI解决Jacobi迭代并行化的文章,这个与都志辉 并行程序一书的例子有相似之处.链接http://w ...

最新文章

  1. Android模拟器入门
  2. 金额大小写转换(1)
  3. python实战系列之写个好玩的猜拳游戏(附源代码)
  4. 关于混合使用智能指针和内置指针的自己的问题和自己的见解(问题搜集中)这个帖子有待解决的问题
  5. python exit 0_python中 os._exit() 和 sys.exit(), exit(0)的用法和区别
  6. Java Throwable toString()方法与示例
  7. [C++] 如此聪明的C++编译器
  8. Mp4v2实现h264+aac打包成Mp4视频文件
  9. 可以载入史册的新名词:市场经济(蝳品经济)的上瘾依赖特性
  10. TCP协议和UDP协议
  11. html气泡写法,制作CSS气泡框
  12. 数据驱动测试该怎么理解?真的像传说中的那么diao吗?
  13. Linux系统内核笔记
  14. git使用中遇到的remote:Permission to xxx denied to xxx问题如何解决报错403找不到的问题
  15. ubuntu安装git失败解决办法
  16. vnc连接,什么是vnc连接?有好用的vnc连接软件推荐吗?
  17. e1000网卡和DMA
  18. Django Admin 上传多张图片并显示缩略图
  19. 基于jsp酒店管理系统设计
  20. 已知函数e ​x ​​ 可以展开为幂级数1+x+x ​2 ​​ /2!+x ​3 ​​ /3!+⋯+x ​k ​​ /k!+⋯。现给定一个实数x,要求利用此幂级数部分和求e ​x ​​ 的近似值,求和

热门文章

  1. thinkpython2e在线阅读_LaTeX排版的《Think Python 2e》最新版中文翻译
  2. To rename a docker image
  3. Ubuntu14.04安装apt-get方法Lnmp环境
  4. IO流操作-图片操作(二)
  5. java中的foreach语句
  6. Windows server 2012体验之集成ISCSI功能
  7. Highlight – 代码高亮html输出软件
  8. X皮书之shell 常用代码
  9. 哈夫曼编码(Huffman)Java实现代码简化版
  10. 数据结构源码笔记(C语言):直接选择排序