MPI程序例子 test_8_1_2.c -- 对等模式的MPI程序,Jacobi迭代 (MPI_Send、MPI_Recv)
NOTE:
这里首先需要弄明白 Jacobi迭代是做什么的,怎么操作。
网上找到的一篇讲解使用 MPI解决Jacobi迭代并行化的文章,这个与都志辉 并行程序一书的例子有相似之处。链接http://www.doc88.com/p-99830356011.html。下边程序算法主要步骤代码段为,这个步骤为矩阵每个数取相邻四个数的中值。
数据分块:
for(j=begin_col;j<=end_col;j++)for(i=1;i<totalsize-1;i++)b[i][j]=0.25*(a[i][j+1]+a[i][j-1]+a[i+1][j]+a[i-1][j]);for(j=begin_col;j<=end_col;j++)for(i=1;i<totalsize-1;i++)a[i][j]=b[i][j];
/*对等模式的MPI程序:test_8_1_2.cJacobi迭代:迭代数据按列进行分割,并假设一共有4个进程同时并行计算。
*/
#include "mpi.h"
#include <stdio.h>#define totalsize 16
#define mysize totalsize/4 //分成四块,每块大小
#define steps 10void main(int argc,char* argv[])
{int myid,numprocs,n,i,j,rc;float a[totalsize][mysize+2],b[totalsize][mysize+2]; //除分块大小外,还包括左右两边各一列float temp[totalsize]; /* 临时数组 */int begin_col,end_col,ierr;MPI_Status status;MPI_Init(&argc,&argv);/* 得到当前进程标识和总的进程个数 */MPI_Comm_rank(MPI_COMM_WORLD,&myid);MPI_Comm_size(MPI_COMM_WORLD,&numprocs);fprintf(stderr,"Process %d of %d is alive.\n",myid,numprocs);/* 数组初始化 *///NOTE: 整个数组置值为0, 行数为 totalsize, 列数为 mysize+2for(j=0;j<mysize+2;j++)for(i=0;i<totalsize;i++)a[i][j]=0.0;if(myid==0)for(i=0;i<totalsize;i++)a[i][1]=8.0;if(myid==3)for(i=0;i<totalsize;i++)a[i][mysize]=8.0;for(i=1;i<mysize+1;i++){ a[0][i]=8.0;a[totalsize-1][i]=8.0;} /* Jacobi迭代部分 */for(n=1;n<=steps;n++){//这里从两边分别"获取数据"和"发送数据",每次获取或发送数据时先判断是否会越界/* 从右侧的邻居得到数据 */if(myid<3){MPI_Recv(&temp[0],totalsize,MPI_FLOAT,myid+1,10,MPI_COMM_WORLD,&status);for(i=0;i<totalsize;i++)a[i][mysize+1]=temp[i];//a[i][mysize+1]为块最右一列,表示相邻右侧一块最左边一列}/* 向左侧的邻居发送数据 */if(myid>0){for(i=0;i<totalsize;i++)temp[i]=a[i][1];MPI_Send(&temp[0],totalsize,MPI_FLOAT,myid-1,10,MPI_COMM_WORLD);}/* 向右侧的邻居发送数据 */if(myid<3){for(i=0;i<totalsize;i++)temp[i]=a[i][mysize];MPI_Send(&temp[0],totalsize,MPI_FLOAT,myid+1,10,MPI_COMM_WORLD);}/* 从左侧的邻居得到数据 */if(myid<3){MPI_Recv(&temp[0],totalsize,MPI_FLOAT,myid-1,10,MPI_COMM_WORLD,&status);for(i=0;i<totalsize;i++)a[i][0]=temp[i];//a[i][0] 为块最左一列,表示相邻左侧一块最右一列}begin_col=1;end_col=mysize;if(myid==0)begin_col=2;if(myid==3)end_col=mysize-1;for(j=begin_col;j<=end_col;j++)for(i=1;i<totalsize-1;i++)b[i][j]=0.25*(a[i][j+1]+a[i][j-1]+a[i+1][j]+a[i-1][j]);for(j=begin_col;j<=end_col;j++)for(i=1;i<totalsize-1;i++)a[i][j]=b[i][j];// MPI_Barrier(MPI_COMM_WORLD);}/* 迭代结束 */MPI_Barrier(MPI_COMM_WORLD);/* 输出结果 */fprintf(stderr,"\nProcess %d :\n",myid);begin_col=1;end_col=mysize;for(i=0;i<totalsize;i++){for(j=begin_col;j<=end_col;j++)fprintf(stderr,"%.2fP%d\t",a[i][j],myid);fprintf(stderr,"\n");}fprintf(stderr,"\n");MPI_Finalize();
}
MPI程序例子 test_8_1_2.c -- 对等模式的MPI程序,Jacobi迭代 (MPI_Send、MPI_Recv)相关推荐
- 小程序开发有哪些盈利模式?
小程序开发有哪些盈利模式?虽然微信小程序的火爆,令许多企业心神向往,纷纷涉足长沙小程序开发,但就如何切入,怎样实现营收,却鲜有企业能够搞清楚.有鉴于此,为了让广大企业更好的了解小程序的盈利模式,接下来 ...
- 【MPI学习3】MPI并行程序设计模式:不同通信模式MPI并行程序的设计
学习了MPI四种通信模式 及其函数用法: (1)标准通信模式:MPI_SEND (2)缓存通信模式:MPI_BSEND (3)同步通信模式:MPI_SSEND (4)就绪通信模式:MPI_RSEND ...
- 三菱伺服定长追剪,系统为Q172DSCPU,高级同步模式。 包含一个程序例子,有详细的机械参数分析,伺服参数设置
三菱伺服定长追剪,系统为Q172DSCPU,高级同步模式. 包含一个程序例子,有详细的机械参数分析,伺服参数设置,以及追剪凸轮表设置的由来. ID:69100609575345770个人资料窝
- 用遥控器的例子逐步介绍命令模式
用遥控器的例子逐步介绍命令模式 摘要 这一篇文章用一个非常非常详细的用遥控器控制家电的例子来解释命令模式,用命令模式和不用命令模式的情况都有了具体的代码,方便大家做出比较,进而得到命令模式的优缺点.一 ...
- 三菱伺服定长追剪,系统为Q172DSCPU 包含一个程序例子,有详细的机械参数分析,伺服参数设置
三菱伺服定长追剪,系统为Q172DSCPU,高级同步模式. 包含一个程序例子,有详细的机械参数分析,伺服参数设置,以及追剪凸轮表设置的由来. ID:69100609575345770个人资料窝
- Spring学习(2)-程序间耦合和工厂模式解耦
程序的耦合及解耦 本文目录 程序的耦合及解耦 1.什么是程序的耦合 2.解决程序耦合的思路 3.工厂模式解耦 4.控制反转-Inversion Of Control 5.使用 spring 的 的 I ...
- 【嵌入式】Libmodbus之TCP模式Master端程序示例
00. 目录 文章目录 00. 目录 01. TCP模式Master开发流程 02. 读写单个线圈程序示例 03. 读写多个线圈程序示例 04. 读写单个保持寄存器程序示例 05. 读写多个保持寄存器 ...
- 【嵌入式】Libmodbus之RTU模式Slave端程序示例
00. 目录 文章目录 00. 目录 01. 开发RTU Slave端程序流程 02. RTU Slave端程序示例 03. RTU Slave端程序说明 04. 预留 05. 附录 01. 开发RT ...
- 【嵌入式】Libmodbus之RTU模式Master端程序示例
00. 目录 文章目录 00. 目录 01. 软件开发流程 02. 获取版本信息 03. 读写单个线圈程序示例 04. 读写多个线圈程序示例 05. 读写单个保持寄存器程序示例 06. 读写多个保持寄 ...
最新文章
- Lync和Exchange 2013集成PART5:UCS和HD头像
- 公司--超级链接跳转和表单提交,删除的表单提交和删除失败的提示信息
- VMware 11完全安装Mac OS X 10.10
- 潍坊学院计算机系崔玲玲,人工免疫算法在引水工程中的应用.pdf
- 掌握神经网络,我应该学习哪些至关重要的知识点?
- Java并发篇_乐观锁与悲观锁
- wps如何保存最终状态_怎么让word显示最终状态
- 斗鱼赴美上市 穷途末路还是绝处逢生?
- [附源码]java毕业设计社区医院电子病历系统
- Web 实现登录记住密码功能
- H3CNE题库(带答案版)
- 做技术的出路在哪里?---什么叫有前途?钱图钱图,用最省力的方式挣到更多的钱的路径就是前途
- oracle sql去重
- Unsupervised Time-Series Representation Learning with Iterative Bilinear Temporal-Spectral Fusion
- 让割草类游戏更有趣的攻击动作设计技巧
- 你想知道,Microsoft Edge这种巨型项目是如何进行版本管理的吗?
- 大众疑问:学会PS 可以找什么工作
- 绝对硬核的pdf编辑转换工具
- 网站敏感骂人词库及算法(附6仟个敏感词)
- 用 Python 爬取 QQ 空间说说和相册
热门文章
- 鸿蒙系统和你,鸿蒙系统面世,但与您所想的不一样
- java arraylist add时默认调用tostring_Java基础知识之ArrayList知识点总结
- C++11 function用法 可调用对象模板类
- java JDBC操作MySQL数据库
- Windows请求连接 Vmware+Ubuntu14被拒绝 的幽怨诉说
- :Android网络编程--XML之解析方式:SAX
- 1052. Linked List Sorting
- 深入分析linux内核及其应用(更新完毕)
- java 蓝桥杯算法训练 P1102
- php团队奖,PHP生成奖状