矩阵乘法的并行算法分析
- 格式:pptx
- 大小:414.06 KB
- 文档页数:22
一、实验目的1. 理解矩阵乘法的概念和运算规则。
2. 掌握矩阵乘法的编程实现方法。
3. 通过实验验证矩阵乘法的正确性。
二、实验环境1. 操作系统:Windows 102. 编程语言:Python3. 库:NumPy三、实验原理矩阵乘法是指两个矩阵相乘的运算。
设矩阵A为m×n的矩阵,矩阵B为n×p的矩阵,则它们的乘积C为一个m×p的矩阵。
矩阵乘法的运算规则如下:C[i][j] = Σ(A[i][k] B[k][j]),其中k为1到n的整数。
四、实验步骤1. 导入NumPy库。
```pythonimport numpy as np```2. 定义矩阵A和B。
```pythonA = np.array([[1, 2], [3, 4]])B = np.array([[5, 6], [7, 8]])```3. 计算矩阵A和B的乘积C。
```pythonC = np.dot(A, B)```4. 打印结果。
```pythonprint("矩阵A:")print(A)print("矩阵B:")print(B)print("矩阵C(A乘B):")print(C)```五、实验结果与分析1. 运行实验程序,得到以下结果:```矩阵A:[[1 2][3 4]]矩阵B:[[5 6][7 8]]矩阵C(A乘B):[[19 22][43 50]]```2. 分析结果:- 矩阵A为2×2的矩阵,矩阵B为2×2的矩阵,它们的乘积C为2×2的矩阵。
- 根据矩阵乘法的运算规则,我们可以计算出矩阵C的每个元素。
- 实验结果与理论计算相符,说明矩阵乘法的编程实现是正确的。
六、实验总结1. 本实验成功实现了矩阵乘法的编程,验证了矩阵乘法的正确性。
2. 通过实验,加深了对矩阵乘法概念和运算规则的理解。
3. NumPy库在矩阵运算方面具有强大的功能,为编程提供了便利。
稀疏矩阵乘法并行全文共四篇示例,供读者参考第一篇示例:稀疏矩阵乘法是一种重要的数值计算问题,它在很多领域都有着广泛的应用,比如图像处理、机器学习等。
由于稀疏矩阵的特性是大部分元素都是0,只有少量非零元素,所以传统的矩阵乘法算法在处理稀疏矩阵时会浪费大量的计算资源。
为了解决这个问题,人们提出了一种并行计算的方法,即利用多个处理器同时计算矩阵乘法,从而提高计算效率。
在并行计算中,稀疏矩阵乘法也有着自己的特点和挑战。
稀疏矩阵的非零元素分布在整个矩阵中,处理起来比较困难。
矩阵乘法的计算量随着非零元素的增加而增加,所以需要合理地分配计算资源和任务。
稀疏矩阵乘法的并行计算需要考虑通信开销和负载均衡,以充分利用多个处理器的计算能力。
为了解决上述问题,人们提出了一些并行的稀疏矩阵乘法算法。
其中比较有代表性的是基于CSR(Compressed Sparse Row)格式的算法。
CSR格式是一种压缩存储稀疏矩阵的方法,它将矩阵分成三部分:非零元素数组、列索引数组和行偏移数组。
基于CSR格式的算法在并行计算中能够有效地减少通信开销,提高计算效率。
还有一些其他的并行稀疏矩阵乘法算法,比如基于COO (Coordinate)格式、基于Ecoo(Ellpack-Chebyshev)格式等。
这些算法都有着自己的特点和适用场景,可以根据具体的问题选择合适的算法。
在并行计算中,负载均衡是一个非常重要的问题。
负载不均衡会导致一些处理器的计算资源被浪费,影响整体的计算效率。
为了解决负载均衡问题,人们提出了一些方法,比如动态任务分配、静态任务划分、自适应任务调度等。
这些方法能够根据任务的计算量和数据分布特点,合理地分配任务,从而提高计算效率。
除了负载均衡,通信开销也是一个需要考虑的重要问题。
在并行计算中,处理器之间需要进行通信,传递计算结果和数据,这会导致一定的开销。
为了减小通信开销,人们提出了一些方法,比如数据压缩、异步通信、消息合并等。
北京科技大学计算机与通信工程学院实验报告实验名称:学生姓名:专业:班级:学号:指导教师:实验成绩:________________________________实验地点:实验时间:2015年05月一、实验目的与实验要求1、实验目的1对比矩阵乘法的串行和并行算法,查看运行时间,得出相应的结论;2观察并行算法不同进程数运行结果,分析得出结论;2、实验要求1编写矩阵乘法的串行程序,多次运行得到结果汇总;2编写基于MPI,分别实现矩阵乘法的并行化。
对实现的并行程序进行正确性测试和性能测试,并对测试结果进行分析。
二、实验设备(环境)及要求《VS2013》C++语言MPICH2三、实验内容与步骤实验1,矩阵乘法的串行实验(1)实验内容编写串行程序,运行汇总结果。
(2)主要步骤按照正常的矩阵乘法计算方法,在《VS2013》上编写矩阵乘法的串行程序,编译后多次运行,得到结果汇总。
实验2矩阵乘法的并行化实验3个总进程5个总进程7个总进程9个进程16个进程四:实验结果与分析(一)矩阵乘法并行化矩阵并行化算法分析:并行策略:1间隔行带划分法算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中对于矩阵A*B如图:进程1:矩阵A第一行进程2:矩阵A第二行进程3:矩阵A第三行进程1:矩阵A第四行时间复杂度分析:f(n) =6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2(k为从进程分到的行数)因此O(n)=(n);空间复杂度分析:从进程的存储空间不共用,f(n)=n;因此O(n)=(n);2间隔行带划分法算法描述:将C=A*B中的A矩阵按行划分,从进程分得其中的几行后同时进行计算,最后通信将从进程的结果合并的主进程的C矩阵中对于矩阵A*B如图:进程1:矩阵A第一行进程2:矩阵A第二行进程3:矩阵A第三行进程3:矩阵A第四行时间复杂度分析:f(n) =6+2+8+k*n+k*n+k*n+3+10+n+k*n+k*n+n+2(k为从进程分到的行数)因此O(n)=(n);空间复杂度分析:从进程的存储空间不共用,f(n)=n;因此T(n)=O(n);测试环境简介:《VS2013》Win7旗舰版正确性测试结果:并行结果:串行结果:通过比较发现两者相同,因此可以确定运算结果正确。
一、介绍Matlab是一种用于数学建模、仿真和数据分析的高级编程语言和交互式环境。
在矩阵乘法运算中,Matlab提供了许多优化和并行化的方法,以加快矩阵乘法的计算速度。
本文将详细介绍Matlab中矩阵乘法并行运算的相关知识和技巧。
二、矩阵乘法概述矩阵乘法是线性代数中常见的基本运算,它用于将两个矩阵相乘得到一个新的矩阵。
在Matlab中,矩阵乘法可以使用'*'操作符进行计算。
如果有两个矩阵A和B,它们的矩阵乘法可以表示为C=A*B,其中C 是结果矩阵。
通常情况下,矩阵乘法的计算过程是相当消耗计算资源的。
三、Matlab中的矩阵乘法优化在Matlab中,针对矩阵乘法的优化有许多方法,例如使用专门的矩阵乘法函数、改进矩阵存储方式和并行计算等。
其中,并行计算是加速矩阵乘法计算速度的重要方法之一。
1. Matlab矩阵乘法函数Matlab提供了一系列专门用于矩阵乘法计算的函数,如matmul、mmx等。
这些函数内部已经做了很多优化,能够充分利用计算资源,并且可以适应不同硬件的优化。
2. 改进矩阵存储方式在Matlab中,矩阵可以使用不同的存储方式,如稀疏矩阵、密集矩阵和块状矩阵等。
选择合适的矩阵存储方式可以减少内存占用,提高运算速度。
3. 并行计算Matlab中的并行计算工具箱提供了丰富的并行化函数和工具,可以通过多线程和分布式计算等方式加速矩阵乘法的计算速度。
通过并行计算,可以利用多核处理器和集群计算资源,实现矩阵乘法的并行计算。
四、Matlab中的矩阵乘法并行计算在Matlab中,矩阵乘法的并行计算可以通过多种方式实现。
以下将详细介绍几种常见的矩阵乘法并行计算方法:1. 使用matlabpool进行并行计算Matlab中的matlabpool函数可以方便地创建一个本地并行计算池,通过该计算池可以并行计算矩阵乘法。
通过设置并行计算池的大小和Worker节点的数量,可以充分利用多核处理器的计算资源。
c语言mpi并行计算矩阵乘法
C语言中的MPI(Message Passing Interface)是一种用于编写并行程序的标准,它允许多个进程在不同的计算节点上进行通信和协作。
矩阵乘法是一个经典的并行计算问题,可以通过MPI来实现并行化。
首先,我们需要将矩阵乘法的计算任务分配给不同的进程。
可以将两个矩阵分别分块,然后将这些块分配给不同的进程。
每个进程负责计算其分配到的部分,并将结果发送回主进程。
在C语言中,可以使用MPI库来实现这一过程。
首先,需要初始化MPI环境,并确定每个进程的编号和总进程数。
然后,主进程可以负责将矩阵分块并发送给其他进程,其他进程则接收并进行计算。
计算完成后,结果可以发送回主进程,由主进程进行汇总。
需要注意的是,在并行计算中,需要考虑数据通信的开销以及负载均衡等问题。
合理地分配任务和减少通信开销是并行计算中需要考虑的重要问题。
另外,还可以考虑使用一些优化技术来提高并行矩阵乘法的性
能,比如使用非阻塞通信、优化数据布局以减少通信量、使用多级并行等技术。
总之,使用C语言和MPI实现矩阵乘法的并行计算需要考虑任务分配、数据通信、性能优化等多个方面,需要综合考虑并合理设计并行算法。
矩阵相乘-并行算法LT行度。
对于一个n×n的方阵,棋盘划分最多可以使用n^2个处理器进行并行计算,但使用按行或列分解最多可以使用n个。
对矩阵相乘采用棋盘式划分的算法通常称作Cannon算法。
A)行列划分又叫带状划分(Striped Partitioning),就是将矩阵整行或者整列分成若干个组,每个组指派给一个处理器。
下图所例为4个CPU,8×8矩阵的带状划分。
在带状划分情况下,每个CPU将会均匀分配到2行(列)数据。
8×8矩阵变成了一个1×4或4×1的分块矩阵,每个CPU所属的分块矩阵大小为8×2或2×8。
B)棋盘划分就是将矩阵分成若干个子矩阵,每个子矩阵指派给一个处理器,此时任一处理器均不包含整行或者整列。
下图所示即为4个处理器情况下8×8矩阵的棋盘划分,其中处理器阵列为2×2,每个处理器分配到的子矩阵大小为4×4。
矩阵划分成棋盘状可以和处理器连成二维网孔相对应。
对于一个n×n维矩阵和p×p的二维处理器阵列,每个处理器均匀分配有(n/p)×(n/p)=n^2/p^2个元素。
使用棋盘式划分的矩阵相乘算法一般有两种,Cannon算法和Summa算法。
SUMMA算法能够计算m*l的A矩阵和l*n的B矩阵相乘(m、l、n可不相等),而cannon算法只能实现n*n的A矩阵和n*n的B矩阵相乘,具有很大的局限性。
3.2、算法原理A) 行划分法假设是M*N,计算前,将矩阵N发送给所有从进程,然后将矩阵M分块,将M中数据按行分给各从进程,在从进程中计算M中部分行数据和N的乘积,最后将结果发送给主进程。
这里为了方便,有多少进程,就将M分了多少块,除最后一块外的其他数据块大小都相等,最后一块是剩下的数据,大小大于等于其他数据块大小,因为矩阵行数不一定整除进程数。
最后一块数据在主进程中计算,其他的在从进程中计算。
矩阵向量相乘的并行算法分析作者:雷耀明来源:《大经贸》2016年第09期【摘要】大规模矩阵向量相乘是数值代数中常用的科学计算方式。
其维数增大而造成的计算量增大是计算科学中需要进一步解决的问题。
本文基于矩阵向量不同模式下的计算,给出算法的分析与实现。
【关键词】并行计算矩阵相乘 MPI一、问题背景矩阵是数学以及工程中的一个基本概念,许多科学计算问题往往归结为对矩阵的操作,如三维图像处理、神经网络等。
由于矩阵的运算,特别是大规模矩阵相乘,矩阵的特征值求解等需要大量内存并且耗时的处理过程,单处理机已经无法承受,因此有效地实现大型的矩阵并行算法在实际应用中是非常重要的。
二、大规模矩阵向量相乘的串行算法描述设A和B是两个n×n矩阵,将矩阵A和B的乘积记为C=B×A,那么C也是一个 n×n矩阵,乘积C的第i行第j列的元素等于A的第i行和B的第j列对应的元素乘积的和,可表示为C(i,j)=,特殊地,当考虑矩阵B为矩阵向量。
采用串行算法在传统计算机上计算矩阵乘法时,需要使用比较多的工作单源和存储单元,计算A和B的乘积的结果矩阵C时,每计算出C的一个元素,需要做n 次乘法和n-1次加法,逐项计算个共需执行(n-1)次加法和次乘法,计算效率将受到很大的影响。
串行算法:三、模型建立3.1矩阵相乘按行计算特殊地,考虑B矩阵为,矩阵向量相乘时,我们考虑nxn维矩阵A在n个进程间划分的情况。
将计算机进程编号为,0,1,2…n-1 。
则每一个进程都会存储1xn维矩阵。
进程会存ai1,ai2,ai3…ain。
并且负责计算。
向量C的存储方法与B相同。
考虑P(p3.2 矩阵相乘按列计算按列进行划分是对每一行进行划分然后发送到每个进程上。
我们考虑0,1,2…n维矩阵A在n个进程间划分的情况。
将计算机进程编号为0,1,2…n-1。
对于矩阵的第一行,a11…a1n进行划分,进程pi接收到元素的为ai1,每一行划分后,进程pi接收到的元素为a1i…ani。
矩阵乘法是线性代数中一个基础且重要的运算,广泛应用于科学计算、数据分析和工程领域。
为了深入了解矩阵乘法的并行化实现,提高计算效率,本实验旨在通过MPI(Message Passing Interface)并行编程技术,实现矩阵乘法的并行计算,并分析其性能。
二、实验内容与方法1. 实验环境操作系统:Ubuntu Linux编译器:gcc并行计算平台:632核CPU、400GB内存的分布内存并行计算平台2. 实验方法(1)矩阵乘法算法本实验采用经典的矩阵乘法算法,即按行优先顺序进行计算。
具体步骤如下:① 将矩阵A、B、C划分为p个块,每个块包含m/p行和n/p列。
② 每个进程负责计算C的一个子块,即计算A的m/p行与B的n/p列的乘积。
③ 进程间通过MPI通信进行数据交换,实现并行计算。
(2)MPI编程本实验采用MPI编程实现矩阵乘法。
主要使用以下MPI语句:① MPI_Init:初始化MPI环境。
② MPI_Comm_size:获取进程总数。
③ MPI_Comm_rank:获取进程编号。
④ MPI_Send:发送数据。
⑤ MPI_Recv:接收数据。
⑥ MPI_Finalize:结束MPI环境。
1. 矩阵乘法结果验证通过比较串行计算和并行计算的结果,验证了程序的正确性。
2. 性能分析(1)执行时间在固定矩阵规模n=1000的情况下,分别测试进程数取1、2、4、8、16、32、64时的执行时间。
结果表明,随着进程数的增加,执行时间逐渐减少,且呈近似线性关系。
(2)加速比加速比是指并行计算时间与串行计算时间的比值。
本实验计算了不同进程数下的加速比,发现随着进程数的增加,加速比逐渐提高,且在进程数达到一定数量后,加速比趋于稳定。
(3)并行效率并行效率是指实际加速比与理论加速比之比。
本实验计算了不同进程数下的并行效率,发现随着进程数的增加,并行效率逐渐提高,但存在一个峰值,之后逐渐降低。
四、实验结论与展望1. 结论本实验通过MPI并行编程技术实现了矩阵乘法的并行计算,验证了程序的正确性。
【DOC】-矩阵相乘的并行算法的设计与实现矩阵相乘的并行算法的设计与实现仲恺农业工程学院实验报告纸计算机科学与工程学院(院、系) 网络工程专业 083 班组并行计算应用试验课实验三矩阵相乘的并行算法的设计与实现一、实验目的理解和掌握矩阵相乘的并行算法的设计思想以及实现原理二、实验内容编译和运行一个两矩阵相乘算法的并行程序三、实验步骤1 使用vi编辑器输入并行计算的代码,保存在multi.c中#include <stdio.h>#include "mpi.h"#define NRA 62#define NCA 15#define NCB 7#define MASTER 0#define FROM_MASTER 1#define FROM_WORKER 2MPI_Status status;int main(int argc, char *argv[]){int numtasks,taskid,numworkers,source,dest,nbytes,mtype,intsize,dbsize,rows,averow,extra,offset,i,j,k,count;double a[NRA][NCA],b[NCA][NCB],c[NRA][NCB];intsize = sizeof(int);dbsize = sizeof(double);第 1 页共 7 页MPI_Init(&argc,&argv); MPI_Comm_rank(MPI_COMM_WORLD,&taskid);MPI_Comm_size(MPI_COMM_WORLD,&numtasks); numworkers = numtasks-1;if(taskid==MASTER) { printf("Number of worker tasks= %d\n",numworkers); for(i=0;i<NRA;i++) for(j=0;j<NCA;j++)a[i][j]=i+j; for(i=0;i<NCA;i++) for(j=0;j<NCB;j++) b[i][j]=i*j;averow=NRA/numworkers; extra=NRA%numworkers; offset=0; mtype=FROM_MASTER;for(dest=1;dest<=numworkers;dest++) { rows=(dest<=extra)?averow+1:averow; printf("sending %d rows to task %d\n",rows,dest);MPI_Send(&offset,1,MPI_INT,dest,mtype,MPI_COMM_WORLD);MPI_Send(&rows,1,MPI_INT,dest,mtype,MPI_COMM_WORLD); count=rows*NCA;MPI_Send(&a[offset][0],count,MPI_DOUBLE,dest,mtype,MPI_COMM_WORLD); count=NCA*NCB;MPI_Send(&b,count,MPI_DOUBLE,dest,mtype,MPI_COMM_WORLD);offset=offset+rows; } mtype=FROM_WORKER; for(i=1;i<=numworkers;i++){ source = i;MPI_Recv(&offset,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status);MPI_Recv(&rows,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status);count=rows*NCB;MPI_Recv(&c[offset][0],count,MPI_DOUBLE,source,mtype,MPI_COMM_WORLD,&status); } printf("Here is the result matrix\n"); for(i=0;i<NRA;i++) { printf("\n"); for(j=0;j<NCB;j++) printf("%6.2f ",c[i][j]); }printf("\n"); } 第 2 页共 7 页if(taskid>MASTER) {mtype=FROM_MASTER;source=MASTER;printf("Master=%d,mtype=%d\n",source,mtype);MPI_Recv(&offset,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status);printf("offset=%d\n",offset);MPI_Recv(&rows,1,MPI_INT,source,mtype,MPI_COMM_WORLD,&status);printf("rows=%d\n",rows);count=rows*NCA;MPI_Recv(&a,count,MPI_DOUBLE,source,mtype,MPI_COMM_WORLD,&status); printf("a[0][0]=%e\n",a[0][0]);count=NCA*NCB;MPI_Recv(&b,count,MPI_DOUBLE,source,mtype,MPI_COMM_WORLD,&status); printf("b=\n");for(k=0;k<NCB;k++)for(i=0;i<rows;i++) {c[i][k]=0.0;for(j=0;j<NCA;j++)c[i][k]=c[i][k]+a[i][j]*b[j][k];}mtype=FROM_WORKER;printf("after computer\n");MPI_Send(&offset,1,MPI_INT,MASTER,mtype,MPI_COMM_WORLD);MPI_Send(&rows,1,MPI_INT,MASTER,mtype,MPI_COMM_WORLD);MPI_Send(&c,rows*NCB,MPI_DOUBLE,MASTER,mtype,MPI_COMM_WORLD); printf("after send\n");}MPI_Finalize();return 0;}2 编译multi.cmpicc –o multi.o multi.c3 启动mpd后台程序mpd&4 在单机上运行multi.ompirun –np 10 ./multi.o5 在多台计算机上运行multi.o(1) 编辑并行计算的主机文件nodelistnode1:5node2:4node3:8(2) 运行并行计算程序mpirun -machinefile nodelist -np 2 ./multi.o 四、实验结果第 3 页共 7 页Master=0,mtype=1Master=0,mtype=1Number of worker tasks = 9sending 7 rows to task 1sending 7 rows to task 2sending 7 rows to task 3sending 7 rows to task 4sending 7 rows to task 5sending 7 rows to task 6sending 7 rows to task 7sending 7 rows to task 8sending 6 rows to task 9 Master=0,mtype=1offset=0rows=7a[0][0]=0.000000e+00b=after computerafter sendMaster=0,mtype=1offset=7rows=7a[0][0]=7.000000e+00b=after computerafter sendMaster=0,mtype=1offset=14rows=7a[0][0]=1.400000e+01b=after computerafter sendMaster=0,mtype=1offset=28rows=7a[0][0]=2.800000e+01 b=after computerafter sendMaster=0,mtype=1 offset=56rows=6第 4 页共 7 页b=after computerafter sendMaster=0,mtype=1 offset=21rows=7a[0][0]=2.100000e+01 b=after computerafter sendMaster=0,mtype=1 offset=49rows=7a[0][0]=4.900000e+01 b=after computerafter sendoffset=35rows=7a[0][0]=3.500000e+01b=after computerafter sendoffset=42rows=7a[0][0]=4.200000e+01b=after computerafter sendHere is the result matrix 第 5 页共 7 页第 6 页共 7 页双机运行的结果:Number of worker tasks = 1sending 62 rows to task 1Master=0,mtype=1offset=0rows=62a[0][0]=0.000000e+00b=after computerafter sendHere is the result matrix计算出来的矩阵与单机的相同五、实验心得本次实验是通过程序生成两个静态的矩阵,然后计算出两个矩阵的乘机。
矩阵相乘-并行算法并行处理技术课程设计分析报告课程设计题目矩阵相乘并行算法设计姓名廖杰学号M201372880专业计算机技术任课教师金海石宣化所在学院计算机科学与技术学院报告提交日期2014-01-13行度。
对于一个n×n的方阵,棋盘划分最多可以使用n^2个处理器进行并行计算,但使用按行或列分解最多可以使用n个。
对矩阵相乘采用棋盘式划分的算法通常称作Cannon算法。
A)行列划分又叫带状划分(Striped Partitioning),就是将矩阵整行或者整列分成若干个组,每个组指派给一个处理器。
下图所例为4个CPU,8×8矩阵的带状划分。
在带状划分情况下,每个CPU将会均匀分配到2行(列)数据。
8×8矩阵变成了一个1×4或4×1的分块矩阵,每个CPU所属的分块矩阵大小为8×2或2×8。
B)棋盘划分就是将矩阵分成若干个子矩阵,每个子矩阵指派给一个处理器,此时任一处理器均不包含整行或者整列。
下图所示即为4个处理器情况下8×8矩阵的棋盘划分,其中处理器阵列为2×2,每个处理器分配到的子矩阵大小为4×4。
矩阵划分成棋盘状可以和处理器连成二维网孔相对应。
对于一个n×n维矩阵和p×p的二维处理器阵列,每个处理器均匀分配有(n/p)×(n/p)=n^2/p^2个元素。
使用棋盘式划分的矩阵相乘算法一般有两种,Cannon算法和Summa算法。
SUMMA算法能够计算m*l的A矩阵和l*n的B矩阵相乘(m、l、n可不相等),而cannon算法只能实现n*n的A矩阵和n*n的B矩阵相乘,具有很大的局限性。
3.2、算法原理A) 行划分法假设是M*N,计算前,将矩阵N发送给所有从进程,然后将矩阵M分块,将M中数据按行分给各从进程,在从进程中计算M中部分行数据和N的乘积,最后将结果发送给主进程。
矩阵乘法MPI并行程序报告1. 实验目的1.1掌握集群的使用方法。
1.2掌握以并行的方式分析问题、设计并行程序的方法。
1.3掌握如何对并行程序进行简单的性能分析2. 实验要求2.1使用MPI、OpenMp等并行程序设计方法设计矩阵乘法的并行程序。
2.2随机产生所需的矩阵元素,数据项不得少于1000*1000。
2.3尽量设计较高的加速比3. 实验环境3.1硬件环境:两个集群节点blade13、blade15。
3.2软件环境:Linux、gcc、Win7、VC++6.0。
3.3连接方式:Xmanager Enterprise4.0远程桌面连接211.69.198.203。
4. 实验程序4.1随机算法产生矩阵:srand((unsigned int)time(NULL));for (i=0; i<N; i++){for (j=0; j<N; j++){A[i][j] = rand() % 10;B[i][j] = rand() % 10;C[i][k] = 0;}}4.2串行程序设计time(&start);for (i=0; i<M; i++){for (k=0; k<M; k++){C[i][k] = 0;for (j=0; j<M; j++)1 / 28{C[i][k] += A[i][j]*B[j][k];}}}time(&end);4.3并行程序设计MPI_Init(&argc,&argv) 和MPI_Finalize() MPI_Init用来初始化MPI执行环境,建立多个MPI 进程之间的联系,为后续通信做准备。
而MPI_Finalize则是结束MPI执行环境。
这两个函数就是定义MPI程序的并行区的,除了检2 / 28测是否初始化的函数之外,不应该在这两个函数定义的区域外调用其它MPI函数。
这两个函数都返回整型值,标识函数是否调用成功。
一种矩阵相乘的并行算法实现与性能评测苑野;于永澔【摘要】With traditional serial algorithm for matrix multiplication , the result will be con-strained by matrix scale , CPU frequency , and memory size and storage space .The most ef-fective way to solve the limitation was parallel algorithm .Therefore, this paper completed the matrix multiplication with SPMD model and MPI in cluster computing environment .Experi-mental results showed that this algorithm under a certain size of the matrix has a good speed-up and efficiency .%用传统的串行算法进行矩阵相乘运算会受到矩阵规模、单机的CPU主频、内存大小和存储器空间等方面的限制。
而使用并行算法是解决上述限制的最有效途径。
为此,在集群计算环境下,使用SPMD计算模型和基于MPI消息传递技术设计实现了矩阵相乘的并行算法。
实验表明,此并行算法在一定矩阵规模下具有较好的加速比和并行效率。
【期刊名称】《哈尔滨商业大学学报(自然科学版)》【年(卷),期】2014(000)005【总页数】4页(P604-607)【关键词】矩阵相乘;消息传递接口;加速比;并行效率【作者】苑野;于永澔【作者单位】哈尔滨工业大学基础与交叉科学研究院,哈尔滨150080;哈尔滨工业大学基础与交叉科学研究院,哈尔滨150080【正文语种】中文【中图分类】TP319随着多核处理器技术、高速网络和分布式计算技术的发展,集群系统已经成为高性能计算领域最重要的计算平台[1].集群系统具有性能价格比高、可扩展性好、高可用性、高利用率和易用性好等特点.MPI(Message Passing Interface)[2]是面向并行编程环境下的一种基于消息传递的标准函数库,被广泛应用于分布式存储的可扩展的并行计算机(Scalable Parallel Computers)和工作站集群(Networks of Workstations).MPI具有较高的通信性能、程序可移植性好、可扩展性好、程序代码实现灵活及高效统一的编程环境等特点.由于集群系统具有典型的分布式存储特征,因此MPI编程模型已经成为目前集群系统上主流的并行程序设计环境.矩阵计算主要应用于科学与工程计算领域,是科学计算的核心问题.而矩阵相乘是矩阵计算最基本的运算.用传统的串行算法库进行矩阵相乘运算[3-4]会受到矩阵规模、单机硬件性能(CPU速度、内存大小、存储器空间)等方面的限制.对串行算法进行并行化处理,使其达到更高的运算性能,是解决上述限制的最有效途径.人们采用了各种方法对矩阵相乘进行并行化处理,并取得了一定的进展,主要包括基于顺序矩阵直接相乘算法(行列划分方法)、基于递归实现的块矩阵相乘方法、基于二维网格实现的矩阵相乘算法(Cannon算法、脉动阵列算法)和Strassen算法等.行列划分算法是经典的矩阵相乘算法中的一种,以其并行时间复杂性优良、代码简单且易于实现等优势使该方法备受研究者的重视.本文在集群环境下,使用SPMD计算模型及MPI消息传递技术对矩阵相乘的行列划分方法进行了并行化算法实现,并定量的对该并行算法的性能进行了测试,实验表明此并行算法在一定矩阵规模下具有较好的加速性能及效率,优于传统的串行算法.1 MPI编程技术MPI是一种消息传递编程模型[5],并已经成为这种编程模型事实上的标准.它不是一种编程语言,而是一个并行函数库.MPI标准函数库为C语言和FORTRAN语言提供了通用的并行程序编程接口.一个MPI系统通常由一组函数库、头文件和相应的运行、调试环境组成.MPI并行程序通过调用MPI库中的函数来完成消息传递. 1.1 MPI基本概念1.1.1 进程组(process group)MPI程序全部进程集合的一个有序子集.进程组中的进程被赋予一个惟一的序号(rank),用于标识该进程.1.1.2 通信器(communicator)由一个进程组和一个标识构成.在该进程组中,进程间可以相互通信.MPI程序中的所有通信必须在通信器中进行.默认的通信器是MPI_COMM_WORLD,所有启动的MPI进程通过调用函数MPI_Init()包含在通信器中,每个进程通过函数MPI_Comm_size()获取通信器中的初始MPI进程个数.通信器可分为在同一进程组内通信的域内通信器和在不同进程组进程间通信的域间通信器.1.1.3 进程序号(rank)MPI程序中用于标识进程组或通信器中一个进程的唯一编号,同一个进程在不同的进程组或通信器中可以有不同的序号.MPI_PROC_NULL代表空进程.1.1.4 消息(message)包括数据(data)和信封(envelope)两部分.数据包含用户将要传递的内容,信封由接收进程序号/发送进程序号、消息标号和通信器三部分组成.消息被封装在“信封”中,然后经缓冲区向网络传输层打包发送.1.1.5 MPI对象MPI系统内部定义的数据结构,包括数据类型、通信器(MPI_Comm)、通信请求(MPI_Request)等,它们对用户不透明.1.1.6 MPI连接器(handles)连接MPI对象的具体变量,用户可以通过它访问和参与相应的MPI对象的具体操作.1.2 点对点通信点对点通信是指在一对进程之间进行的消息收发操作,是MPI中最基本的通信模式.MPI提供阻塞型(blocking)和非阻塞型(non blocking)两种类型的点对点通信函数.阻塞型函数是指一个例程需等待操作完成才返回,返回后用户可以重新使用调用中所占用的资源.非阻塞型函数是指一个例程不必等待操作完成便可以返回,返回后用户不可重用所占用的资源.根据以上两类通信函数的不同特点,MPI提供了四种不同的通信模式,分别是标准模式(standard mode)、缓冲模式(buffered mode)、同步模式(synchronous mode)和就绪模式(ready mode).1.3 聚合通信聚合通信是指在一个通信器内的所有进程同时调用同一个聚合通信函数而进行的通信.聚合通信包括障碍同步(MPI_Barrier)、广播(MPI_Bcast)、数据收集(MPI_Gather)、数据发散(MPI_Scatter)、数据转置(MPI_Alltoall)和规约(MPI_Reduce).2 矩阵乘法并行算法集群上矩阵乘法并行算法采用了行列划分方法、SPMD计算模型和基于MPI消息传递的并行处理技术.假设A为m*k阶矩阵,B为k*n阶矩阵,C为m*n阶矩阵,计算问题C=A*B.令m=m`*p、n=n`*p,矩阵A=[A0t A1t …Ap-1t],矩阵B=[B0 B1 …Bp-1],矩阵A第i行的每个元素与矩阵B第j列的各元素分别相乘,并将乘积相加到矩阵C的第i行第j列的一个元素Ci,j,此时C=(Ci,j)=(AiBj).将j=0,1…,p-1存放在Pi中,使用p个处理机,每次每个处理机计算出一个Ci,j,需要p次完成.具体算法[6-7]如下:beginMp1≡myid+1 mod p,mm1≡myid-1 mod pfor i=0 to p-1 dol≡i+myid mod pCl=ABIf i≠p-1,send(B,mm1),recv(B,mp1)endforendfor在p=n2个处理器进行n*n矩阵乘法时,并行时间的复杂性为O(n).广播算法决定通信开销进而支配通信时间,n*n矩阵通过独立的消息分发到n2个从处理器上,每个从处理器向主处理器返回C的一个元素.其通信时间tcomm=n2(2tstartup+(2n+1)tdata),其中tstartup是数据传送的延迟或启动时间,tdata是数据传输返回时间[8].3 实验验证本文的硬件测试环境是8个节点组成的集群系统,采用Infiniband高速网络互联,每个节点配有1颗Intel Xeon 2.5 G处理器,32 G内存,1 T SAS磁盘,GPFS共享文件系统,软件环境是Red Hat Linux操作系统,编译器为Intel C++13.0.1,MPI的版本为Intel MPI 4.1.加速比和效率是衡量多处理机和单处理机系统相对性能的重要指标.把串行应用程序在单处理机上的执行时间和该程序并行化后在多处理机上的执行时间的比值定义为加速比,它是并行算法可扩展性的重要参数.将加速比与CPU个数之间的比值定义为效率,它反映了在某一时间段内,一个处理器真正用于计算的时间.设矩阵大小分别为1 200×1 200、4 000×4 000,8 000×8 000,各做5次实验,将5次计算时间的平均值作为执行时间.表1为单处理机系统的串行程序执行时间.表2为多处理机系统的并行程序执行时间.图1为矩阵并行程序运行时间变化.图2为不同矩阵规模下运行时间比较.表1 单处理机的串行执行时间矩阵大小串行执行时间1 200×1 2000.411 1214 000×4 0001.124 6448 000×8 0003.280 423表2 多处理机并行程序执行时间矩阵大小并行执行时间 2 节点 4 节点 8 节点1 200×1 200 0.244 172 0.147 231 0.276 6124 000×4 000 0.579 226 1.100 790 0.592 2958000×8 000 2.228 761 1.129 427 0.576 136图1 矩阵并行程序运行时间图2 不同矩阵规模下运行时间比较如图1所示,可以看到在所有矩阵的多节点测试中,并行程序的运行时间随着矩阵规模不断变大时,其运行时间基本保持不断的增加.然而在节点较多(如node=8时)的并行环境下运行时,其并行程序运行时间随矩阵规模变化不明显.如在矩阵为4 000×4 000、8 000×8 000下,运行时间基本保持不变.这主要是因为在程序的执行时间中,绝大部分的时间用于数据的通信而非用于真正的计算.由图2可知,在矩阵规模很大时(当矩阵为8 000×8 000),其运行时间随着节点数的增加而不断减少.其原因是用于计算的时间占了绝大部分,数据通信时间大量减少,并行计算的优势得到了体现.表3为多处理机并行算法的加速比和效率.图3为不同矩阵规模下加速比比较,图4为不同矩阵规模下并行效率比较.图5为矩阵规模在8 000阶下的加速比.表3 多处理机并行算法的加速比和效率矩阵大小 2 节点 4 节点 8 节点加速比效率加速比效率加速比效率1 200×12001.680.842.790.701.480.194 000×4 0001.940.971.020.261.900.248 000×8 0001.470.742.900.735.690.71图3 不同矩阵规模下加速比比较图4 不同矩阵规模下并行效率比较图5 矩阵规模在8 000阶下的加速比如图3~5可知,该并行算法的在不同矩阵规模下,其加速比均大于1,这说明此算法与传统的串行算法相比具有较高的加速性能.当矩阵规模较小时(如矩阵为1 200×1 200时),其加速比随着节点数的增加表现为先迅速变大,然后逐渐变小.并行效率呈现逐渐下降的趋势.在node=4时获得最大加速比2.79,此时的效率为70%.当矩阵的规模较大时(如矩阵为8 000×8 000),其加速比几乎表现为线性增加,在node=8时获得最大加速比5.69,而并行效率几乎保持不变,基本维持的在72%左右.这说明此种并行算法在矩阵规模较大的条件下,加速效果明显,效率较高.4 结语本文对集群计算环境下矩阵相乘问题应用SPMD计算模型和基于MPI消息传递技术实现了其并行算法,并通过实验验证了该算法的有效性.与传统的串行算法相比,结果证明此算法在一定的矩阵规模下具有较好的加速性能及效率.参考文献:[1] CHAI L, LAI P, JIN H, et al. Designing an efficient kernel-level and user-level hybrid approach for mpi intra-node communication on muti-core systems[C]//ICPP’08:Proceedings of the 2008 37th International Conference on Parallel Processing,Washington DC: IEEE Computer Society, 2008.[2] MPI: A Message-Passing Interface Standard[S].[3] BLACKFORD L S, DEMMEL J, J DONGARRA, et al. An update set of basic linear algebra subprograms(BLAS)[J]. ACM Transactions on Mathematical Software,2002, 28(2): 135-151.[4] COHN H, KLEINBERG R, SZEGEDY B, et al. Group-theoretic algorithms for matrix multiplication[C]//Proceedings of the 46th Annual Symposium on Foundations of Computer Science, 23-25 ,2005.[5] MCQUILLAN J M, D WALDEN C. Some considerations for a high performance message-based interprocess communication system [J]. SIGOPS Oper.Syst.Rev., 1975, 9: 77-86.[6] 张林波, 迟学斌. 并行算法导论[M]. 北京: 清华大学出版社,2006.[7] 陆鑫达. 并行程序设计[M]. 北京: 机械工业出版社, 2006.[8] 徐红波,胡文,潘海为,等.高维空间范围查询并行算法研究[J].哈尔滨商业大学学报:自然科学版,2013,29(1):73-75,111.。