并行计算矩阵分块乘法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
一、题目及要求 (1)
1、题目 (1)
2、要求 (1)
二、设计算法、算法原理 (1)
三、算法描述、设计流程 (2)
3.1算法描述 (2)
3.2设计流程 (4)
四、源程序代码及运行结果 (6)
1、超立方 (6)
1.1超立方的源程序代码 (6)
1.2运行结果 (11)
2、网孔连接 (11)
2.1源程序代码 (11)
2.2运行结果 (18)
3、在数学软件中的计算结果 (19)
五、算法分析、优缺点 (19)
1、简单的并行分块乘法的过程为 (19)
2、使用Cannon算法时的算法分析 (20)
3、算法的优缺点 (21)
六、总结 (22)
参考文献 (23)
一、题目及要求
1、题目
简单并行分块乘法:(1)情形1: 超立方连接;(2)情形2:二维环绕网孔连接
已知,177511195310135411274329,7563895712314
2120143321
⎪⎪⎪⎪⎪⎭
⎫ ⎝⎛----=⎪⎪⎪⎪⎪⎭⎫
⎝⎛----=B A 求B A C ⨯=。 2、要求
(1)题目分析、查阅与题目相关的资料; (2)设计算法;
(3)算法实现、代码编写; (4)结果分析和性能分析与改进; (5)论文撰写、答辩;
二、设计算法、算法原理
要考虑的计算问题是C=AB,其中A 与B 分别是n n ⨯矩阵。 ①A 、B 和C 分成p p p ⨯=的方块阵ij A ,ij B 和ij C ,大小均为p
n
p n ⨯
,p 个处理器编号为1
,1, (1)
0,....,0,0---p p p p
p p , ij P 存放ij A ,ij B 和ij C 。
②通讯:每行处理器进行A 矩阵块的多到多播送(得到ik A , k=0~1-p ) 每列处理器进行B 矩阵块的多到多播送(得到kj B , k=0~ 1-p )
③乘-加运算: ij P 做kj p k ik
ij B A
C ∑-==
1
三、算法描述、设计流程
3.1算法描述
超立方情形下矩阵的简单并行分块算法 输入:待选路的信包在源处理器中 输出:将原处理器中的信包送至其目的地 Begin
(1) for i=1 to n do
11--⊗=i i i d s r endfor
(2) S V i ==,1 (3) while n i ≤do
(3.1)if 1=i r then 从当前节点V 选路到节点为V ⊗1 (3.2)1+=i i endwhile End
二维网孔情形下矩阵的简单并行分块算法 输入:待选路的信包处于源处理器中 输出:将各信包送至各自的目的地中 Begin
(1) 沿x 维将信包向左或向右选路至目的地的处理器所在的列 (2) 沿y 维将信包向上或向下选路至目的地的处理器所在的行 分块乘法算法
//输入: n n A ⨯,n n B ⨯ ; 子快大小均为
p
n p
n ⨯
输出: n n C ⨯n
Begin
(1)for i=0 to 1-p do for all par-do ij p if i>k then ij A ←()mod ,1j i A +
endif
if j>k then
ij B ← B (i+1)mod , j endif endfor endfor
for i=0 to 1-p do for all ij p par-do ij C =ij A +ij B endfor Endfor End
3.2设计流程
以下是二维网孔与超立方连接设计流程。 如图3-1 二维网孔 步骤:
(1)先进行行播送; (2)再同时进行列播送;
图3-1 二维网孔示意图
4
4 3
超立方
步骤:依次从低维到高维播送, d-立方, d=0,1,2,3,4…; 算法流程如图所示:
图3-2 算法流程
四、源程序代码及运行结果
1、超立方
1.1超立方的源程序代码
#include "stdio.h"
#include "stdlib.h"
#include "mpi.h"
#define intsize sizeof(int)
#define floatsize sizeof(float)
#define charsize sizeof(char)
#define A(x,y) A[x*K+y]
#define B(x,y) B[x*N+y]
#define C(x,y) C[x*N+y]
#define a(x,y) a[x*K+y]
#define b(x,y) b[x*n+y]
#define buffer(x,y) buffer[x*n+y]
#define c(l,x,y) c[x*N+y+l*n]
float *a,*b,*c,*buffer;
int s;
float *A,*B,*C;
int M,N,K,P ;
int m,n;
int myid;
int p;
FILE *dataFile;
MPI_Status status;
double time1;
double starttime,endtime;
void readData()
{
int i,j;
starttime = MPI_Wtime();
dataFile=fopen("yin.txt","r");
fscanf(dataFile,"%d%d", &M, &K); A=(float *)malloc(floatsize*M*K); for(i = 0; i < M; i++) {
for(j = 0; j < K; j++)
{
fscanf(dataFile,"%f", A+i*K+j);
}