ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:227.83KB ,
资源ID:15244150      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/15244150.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Cannon乘法的MPI实现Word文件下载.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Cannon乘法的MPI实现Word文件下载.docx

1、序号题目名称根本方法和内容要求1LU分解的Open MP完成编写LU分解的Open MP程序2KMP算法的Open MP完成编写KMP算法的OpenMP程序3高斯消元法解线性方程组的Open MP完成编写高斯消元法解线性方程组的OpenMP程序4高斯消元法解线性方程组的MPI完成编写高斯消元法解线性方程组的MPI程序5高斯-塞德尔迭代解线性方程组的MPI完成编写高斯-塞德尔迭代解线性方程组的MPI程序6Cannon乘法的MPI完成编写Cannon乘法的MPI程序7LU分解的MPI完成编写LU分解的MPI程序8随机串匹配算法的MPI完成编写随机串匹配算法的MPI程序9单源最短路径Dijkstra

2、 算法的MPI完成编写单源最短路径Dijkstra算法的MPI程序10快速排序算法的MPI完成编写快速排序算法的MPI程序11KMP串匹配的MPI完成编写KMP串匹配算法的MPI程序Cannon乘法的MPI完成及性能分析摘要:cannon算法是矩阵的并行乘法,属于数值并行算法MPI编程完成一篇,其中关于数值并行算法MPI编程由于要处理的数据量庞大,程序循环次数多,对于串行而言,处理时间将非常长,将其并行化非常必要。本文将矩阵数据进行棋盘划分成多个子矩阵,再分别指派给多个处理器,使个处理器并行运算。关键字:cannon乘法 并行计算 数据划分一、Cannon乘法的MPI完成根本原理Cannon乘

3、法属于数值并行算法MPI编程完成一篇,其中关于数值并行算法MPI编程由于要处理的数据量庞大,程序循环次数多,对于串行而言,处理时间将非常长,使其并行化的一般方法有:1数据相关分析 2数据划分和处理器指派 3循环重构对原有程序并行化,首先要分析计算程序中全部语句间的依赖关系,这称之为相关分析。本工程Cannon乘法的mpi完成,是矩阵运算,阶往往都很高,而且行列之间数据依赖关系也不强,所以就对矩阵进行划分,然后指派给不同的处理器进行处理。最常用的矩阵划分有带状划分和块状划分。1带状划分方法带状划分又叫行列划分,就是将矩阵整行或整列地分成假设干组,各组指派给一个处理器。也可以将假设干行或列指派给一

4、个处理器,而且这些行和列可以是连续的,也可以是等间距的,前者称为块带状的,后者称为循环带状的。2.块状划分方法块状划分又叫棋盘划分,就是将矩阵划分成假设干个子矩阵,每个子矩阵指派给一个处理器,此时任意处理器均不含整行或整列。和带状划分类似,棋盘划分也可分为块棋盘划分和循环棋盘划分。棋盘划分比带状划分可开发更高的并行度,Cannon乘法的mpi完成也正是基于棋盘划分的并行完成。循环重构是指在数据分解之后,相应地将串行程序循环局部进行重构,以完成这种划分所确定的并行计算,主要方法有1循环交换 2拉伸法 3分裂法 4轮转法 5并列法 在三种程序并行化的方法中,数据相关分析和循环重构目的都是挖掘语句间

5、的并行性,而数据划分和处理器指派则重在策略,宏观上挖掘并行性。Cannon算法是一种存储有效的算法,设矩阵和相乘。为了使两矩阵下标满足相乘的要求,和带状的并行分块乘法不同,不是仅仅让B矩阵的各列块循环移动,而是有目的地让A的各行块以及B的各列块皆施行循环移位,从而完成对C的子块的计算。将矩阵A和B分成p个方块Aij和Bij,每块大小为,并将它们分配给个处理器。开始时处理器Pij存放块Aij和Bij,并负责计算块Cij,然后算法开始执行: 将块Aij向左循环移动i步;将块Bij向上循环移动j步;Pij执行乘加运算后将块Aij向左循环移动1步,块Bij向上循环移动1步;重复第步,总共执行次乘加运算

6、和次块Aij和Bij的循环单步移位。二、Cannon乘法的MPI完成内容和步骤实验涉及内容主要有:1数据划分和指派处理器最常用的矩阵数据划分有带状划分和块状划分。设有P个处理器,将矩阵A和B分成p个方块Aij和Bij,每块大小为,并将它们分配给个处理器。2 子矩阵的循环移动处理器Pij存放块Aij和Bij,并负责计算块Cij,在使A矩阵的左右循环移动和B矩阵的上下循环移动时,为了防止在通信过程中发生死锁,奇数号及偶数号处理器的收发顺序被错开,使偶数号处理器先发送后接收;而奇数号处理器先将子矩阵块存于缓冲区Buffer中,然后接收编号在其后面的处理器所发送的子矩阵块,最后再将缓冲区中子矩阵块发送

7、给编号在其前面的处理器。根本算法如下:Begin(1)if (j=0) then /*最左端的子块*/(1.1)将所存的A的子块发送到同行最右端子块所在的处理器中(1.2)接收其右邻处理器中发来的A的子块end if (2)if (j = sqrt(p)-1) and (j mod 2 = 0) then /*最右端子块处理器且块列号为偶数*/(2.1)将所存的A的子块发送到其左邻处理器中(2.2)接收其同行最左端子块所在的处理器发来的A的子块(3)if (j = sqrt(p)-1) and (j mod 2 0) then /*最右端子块处理器且块列号为奇数*/(3.1)将所存的A的子块在

8、缓冲区buffer中做备份(3.2)接收其同行最左端子块所在的处理器发来的A的子块(3.3)将在缓冲区buffer中所存的A的子块发送到其左邻处理器中(4)if (j sqrt(p)-1) and (j mod 2 = 0) and (j 0) then /*其余的偶数号处理器*/(4.1)将所存的A的子块发送到其左邻处理器中(4.2)接收其右邻处理器中发来的A的子块(5)if (j sqrt(p)-1) and (j mod 2 = 1) and (j 0) then /*其余的奇数号处理器*/(5.1)将所存的A的子块在缓冲区buffer中做备份(5.2)接收其右邻处理器中发来的A的子块(

9、5.3)将在缓冲区buffer中所存的A的子块发送到其左邻处理器中End实验步骤1)登陆KD-60图 2.1 KD-60登陆界面2)转至node80节点,上传程序输入命令:ssh loongsonnode80 和密码 进入图界面图2.2 转到节点80的界面再命令vim,进入vim编辑器参加程序,保存为cannon.c 3)编译程序mpicc cannon.c o cannon lm 在目录中查看,已成功。如下列图图2.3 将程序保存并编译后界面4)运行程序输入:mpirun np 4 cannon 4 ,其中第一个4是指定的处理器个数,第二个4是产生随机矩阵的维数,这两个参数在实验过程中可以调

10、整,但要求第一个参数即处理器的个数必须是一个数的平方数。输出:图2.4 cannon乘法运行结果图 2.4 并行程序运行界面 两个参数都是4, 分别输出两个随机矩阵和矩阵的乘积三、数据及结果1.下面列出了两组数据,分别是用一个处理器进行串行运算和四个处理器进行并行运算矩阵维数为200的计算时间比拟。四个处理器处理阶数为200的矩阵相乘时,所花时间为:。单个处理器处理阶数为200的矩阵相乘时,所花时间为:3.727210秒。如图3.1 和图3.2所示。图3.1 四个处理器并行执行结果图图3.2 单个处理器串行执行结果图附:1. 程序模块伪代码:Ann,BnnCn对全部处理器my_rank(my_

11、rank=0,p-1)同时执行如下的算法:(1)计算子块的行号 i=my_rank/sqrt(p)计算子块的列号 j=my_rank mod sqrt(p) (2)for k=0 to -1 doif (ik) then Leftmoveonestep(a) end if /* a循环左移至同行相邻处理器中*/if (jk) then Upmoveonestep(b) end if /* b循环上移至同列相邻处理器中*/ end for (3)for i=0 to m-1 dofor j=0 to m-1 doci,j=0end for(4)for k=0 to -1 dofor i=0 to

12、 m-1 dofor k1=0 to m-1 doci,j= ci,j+ ai,k1* bk1,jLeftmoveonestep(a) /*子块a循环左移至同行相邻的处理器中*/Upmoveonestep(b) /*子块b循环上移至同列相邻的处理器中*/Leftmoveonestep(a) 见实验内容处#include string.hmpi.htime.hstdio.hmath.h/* 全局变量声明 */float *A, *B, *C; /* 总矩阵,C = A * B */float *a, *b, *c, *tmp_a, *tmp_b; /* a、b、c表分块,tmp_a、tmp_b表缓冲区 */int dg, dl, dl2,p, sp; /* dg:总矩阵维数;dl:矩阵块维数;dl2=dl*dl;p:处理器个数;spsqrt(p) */int my_rank, my_row, my_col; /* my_rank:处理器ID;(my_row,my_col):处理器逻辑阵列坐标 */MPI_Status status;float starttime;float time1;/* *函数名: get_index *功能:处理器逻辑阵列坐标至rank号的转换 *输入:坐标、逻辑

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1