并行计算实验指导书..
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
针对大型矩阵的并行计算
实验指导
一、实验目的
1. 了解分布式系统的基本概念;
2.
掌握并行编程的基本思想; 3. 了解并行计算中的死锁和负载平衡等概念,并且通过实验加深理解。
二、实验要求
针对一个矩阵计算的并行算法,实现分布式的存储和大型矩阵的计算,实现矩阵的分解和汇总,用统一的存储方式存储矩阵。可以在多种操作系统下实现,但是必须符合并行和分布式的要求。学习在整个并行计算中获取计算时间和传输时间的方法,并研究随着进程个数的增加,这两个参数的变化规律。语言和平台不限。
三、实验内容及方法
1.实验设计
a) 设计矩阵的存储方式,可以选择现有的一些存储方法(下面有介绍)
b) 设计矩阵分解方法,分配到每个进程所在的机子上的方案以及最后的汇总方式。 c) 选择矩阵计算的一个并行算法,设计程序结构,通信实现方案以及最后的实验对比方案。
通信方式最常用的方式就是SOCKET 通信,当然也可以选择下面介绍的MPI 函数库,最少做两个矩阵的算法对比,主要比较计算时间和通信时间。
2.矩阵的处理
a) 矩阵存储方法简介
A0一般存储
用n m ⨯的数组来存放n m ⨯的矩阵,最普通容易理解的存储技术,保留所有数据信息,计算方便,不需要知道矩阵形态,但对于稀疏矩阵而言,这种存储方式空间利用率不高。
设矩阵n m A R ⨯∈按列存储在一维值数组E 中。首元素存于数组的第0个位置。ij a 为矩阵A 的第i 行第j 列元素。则
[(1)*1]ij a E j n i =-+-
A1对称矩阵存储
对称矩阵的上三角与下三角数据对称,存储矩阵的上三角部分或下三角部分,仅保留一半数据。设矩阵n n A R ⨯∈,按列存储在一维数组E 中。首元素存于数组的第0个位置。ij a 为矩阵A 的第i 行第j 列元素。则上(下)三角存储如式(4-2):
*(1)[1],()2*(1)[1],()2ij j j E i i j a i i E j i j -⎧+-≤⎪⎪=⎨-⎪+->⎪⎩ (2*2)*(1)[],()2(2*2)*(1)[],()2ij n j j E i j i j a n i i E j i i j -+-⎧+-≥⎪⎪=⎨-+-⎪+-<⎪⎩
A2对角线存储法
对角线存储法按对角线进行存储,数组大小为n d ⨯,其中n 为矩阵的阶数,d 为含有非零数据的对角线数量。此外,引入1d ⨯的整型数组,每个整数指明各个非零对角线所在的位置偏离主对角线的偏移量。对于具有d 条非零对角线的n n ⨯的稀疏矩阵A ,可以用两个数组进行表示:一个n d ⨯维的值数组E ,它每一列存储了一条对角线;一个1d ⨯偏移数组12[,,,]d y l l l = ,它存储了各对角线相对主对角线的偏移量。
例如:()12000001234
5000345310106700067080
910118910110120013120130A E y ⎛⎫⎛⎫ ⎪ ⎪ ⎪ ⎪ ⎪ ⎪=⇒==-- ⎪ ⎪ ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭
b)矩阵的分解
最简单的分解方式就是按块分解(包括行列划分),当然针对不同的矩阵算法,分解方法可能就不同,比较常见的分解方式有LU 分解,三角分解等,如果想了解这些算法,可以查阅相关资料。如何将矩阵计算的任务比较均衡的分配到每个进程的问题以及最后的汇总方式,都要针对具体的矩阵算法进行具体的设计,下面结合矩阵乘法的并行算法介绍下:
B0 选择一般存储法作为矩阵的存储方式
B1 矩阵按照行列划分,假设计算A*B ,则A 按照行划分,B 按照列划分,然后将划分的部分存储到对应的进程上(如下图)
B2 矩阵的汇总
按照上面的划分和分配方式,最后每个进程计算的结果为结果矩阵按行划分的分解,所以只要汇总合并成一个矩阵就可以了。
c)程序架构设计
在具体实现矩阵并行乘法时,选择用MPI来搭建机群和并行环境,程序框架如下:
3.可能用到的函数库
a)MPI 并行库
MPI库是不能单独运行的,它可以和fortran或者C/C++绑定使用。它可以提供可信的通信,所以编程者没有必要考虑通信的实现以及可靠性,只要设计通信方案就可以了。基本上所有的操作系统都有对应的MPI版本,。
用MPI+C/C++编程,编程模式比较固定,但是对各个进程的工作任务可以由编程者灵活的分配。MPI给编者提供了一个默认的通信域(MPI_COMM_WORLD),在这个域里的每个进程都有个唯一的标志,并可以互相感知互相通信。关于MPI更多的资料,请同学们自己查阅相关的资料学习。
b) LAPACK 线性代数库
它是一个串行的线性代数库,CLAPACK是LAPACK的C语言接口,该库里的函数接口比较多,基本上所有的矩阵计算的算法都可以在这个库里找到相应的函数接口。如果觉得矩阵计算的算法编程比较烦琐,可以考虑用这个库,可以节省很多时间。
如果想用上面两个库进行编程,可以将函数库集成到所用的开发平台上。从语法上
这两个库的所有对库函数/过程的调用规则和一般的函数/过程没有什么区别.所以没有必要学习新的概念或着语言就可以使用这两个库,但是选择适当的函数也是很麻烦的事情,对于LAPACK库,可能有的算法对应多个函数原形,每个原形的输入,功能可能不同,所以要仔细阅读其说明文挡。
§ MPI的版本
§ MPICH:/mpi/mpich
§ LAM (Local Area Multicomputer):
§ Open-MPI: /
§ CHIMP: ftp:///pub/chimp/release/
§ LAPACK版本
§ LAPACK的主页是 /lapack/
§ CLAPACK则在 /clapack/