稀疏矩阵的矩阵向量乘法的并行算法性能
矩阵-向量并行乘法算法

矩阵-向量乘并行算法: 矩阵 向量乘并行算法: 向量乘并行算法
行带状划分的矩阵-向量乘并行算法 算法 行带状划分的矩阵 向量乘并行算法 输入: 输入 An*n,Bn*1 输出: 输出 Cn*1 Begin 对所有处理器同时执行如下的算法: 对所有处理器同时执行如下的算法: for i=0 to m-1 do c[i]=0.0 for j=0 to n-1 do c[i]=c[i]+a[i,j]*b[j] end for end for End
矩阵-向量乘法的并行算法: 矩阵 向量乘法的并行算法: 向量乘法的并行算法
矩阵-向量乘法同样可以有带状划分和棋盘划分两种并行算法, 矩阵 向量乘法同样可以有带状划分和棋盘划分两种并行算法, 向量乘法同样可以有带状划分和棋盘划分两种并行算法 这里仅讨论行带划分矩阵-向量乘法 列带划分矩阵-向量乘法 向量乘法, 这里仅讨论行带划分矩阵 向量乘法,列带划分矩阵 向量乘法 是类似的。设处理器,个数为,对矩阵按行划分为块, 是类似的。设处理器,个数为,对矩阵按行划分为块,每块含 有连续的行向量,这些行块依次记为, 有连续的行向量,这些行块依次记为,分别存放在标号为的处 理器中,同时将向量广播给所有处理器。 理器中,同时将向量广播给所有处理器。个处理器并行地对存 于局部数组中的行块和向量做乘积操作, 于局部数组中的行块和向量做乘积操作,具体并行算法框架描 述如下: 述如下:
矩阵-向量乘法的串行算法: 矩阵 向量乘法的串行算法: 向量乘法的串行算法
单处理器上矩阵-向量乘算法 算法 单处理器上矩阵 向量乘算法 输入: 输入 An*n,Bn*1 输出: 输出 Cn*1 Begin for i=0 to n-1 do c[i]=0 for j=0 to n-1 do c[i]=c[i]+a[i,j]*b[j] end for end for End
scipy稀疏矩阵按行乘

scipy稀疏矩阵按行乘
稀疏矩阵按行乘是指使用Scipy库中的稀疏矩阵功能进行矩阵乘法运算时按行
进行操作。
在实际应用中,稀疏矩阵往往是非常大的矩阵,因此对于大规模稀疏矩阵的操作效率是非常重要的。
Scipy库提供了一系列的函数和方法来处理稀疏矩阵,其中包括按行乘法操作。
在Scipy库中,稀疏矩阵主要有三种类型:COO格式、CSR格式和CSC格式。
这些格式都有各自的优势和适用场景。
在进行稀疏矩阵按行乘的操作时,通常会选择CSR格式的稀疏矩阵,因为CSR格式在按行进行乘法操作时效率更高。
稀疏矩阵按行乘的操作可以通过矩阵乘法运算来实现。
对于两个稀疏矩阵A和B,可以使用稀疏矩阵乘法的方式来实现按行乘的操作。
具体步骤如下:
1. 将稀疏矩阵A和B转换为CSR格式。
2. 遍历稀疏矩阵A的每一行,将该行乘以稀疏矩阵B的对应列,得到乘积矩
阵的对应行。
3. 将乘积矩阵的对应行存储起来,最终得到稀疏矩阵按行乘的结果。
在实际应用中,稀疏矩阵按行乘的操作可以用于矩阵乘法运算、矩阵向量乘法
等问题的求解。
通过Scipy库提供的稀疏矩阵功能,可以高效地处理大规模稀疏矩
阵的按行乘操作,提高计算效率和节约存储空间。
总的来说,稀疏矩阵按行乘是一种重要的矩阵操作,通过Scipy库提供的稀疏
矩阵功能,可以方便高效地实现这种操作,应用于各种科学计算和工程问题的求解中。
Scipy的稀疏矩阵功能在处理稀疏矩阵的矩阵乘法等操作中具有很大的优势,
是矩阵运算的重要工具之一。
稀疏矩阵乘法 并行

稀疏矩阵乘法并行全文共四篇示例,供读者参考第一篇示例:稀疏矩阵乘法是一种重要的数值计算问题,它在很多领域都有着广泛的应用,比如图像处理、机器学习等。
由于稀疏矩阵的特性是大部分元素都是0,只有少量非零元素,所以传统的矩阵乘法算法在处理稀疏矩阵时会浪费大量的计算资源。
为了解决这个问题,人们提出了一种并行计算的方法,即利用多个处理器同时计算矩阵乘法,从而提高计算效率。
在并行计算中,稀疏矩阵乘法也有着自己的特点和挑战。
稀疏矩阵的非零元素分布在整个矩阵中,处理起来比较困难。
矩阵乘法的计算量随着非零元素的增加而增加,所以需要合理地分配计算资源和任务。
稀疏矩阵乘法的并行计算需要考虑通信开销和负载均衡,以充分利用多个处理器的计算能力。
为了解决上述问题,人们提出了一些并行的稀疏矩阵乘法算法。
其中比较有代表性的是基于CSR(Compressed Sparse Row)格式的算法。
CSR格式是一种压缩存储稀疏矩阵的方法,它将矩阵分成三部分:非零元素数组、列索引数组和行偏移数组。
基于CSR格式的算法在并行计算中能够有效地减少通信开销,提高计算效率。
还有一些其他的并行稀疏矩阵乘法算法,比如基于COO (Coordinate)格式、基于Ecoo(Ellpack-Chebyshev)格式等。
这些算法都有着自己的特点和适用场景,可以根据具体的问题选择合适的算法。
在并行计算中,负载均衡是一个非常重要的问题。
负载不均衡会导致一些处理器的计算资源被浪费,影响整体的计算效率。
为了解决负载均衡问题,人们提出了一些方法,比如动态任务分配、静态任务划分、自适应任务调度等。
这些方法能够根据任务的计算量和数据分布特点,合理地分配任务,从而提高计算效率。
除了负载均衡,通信开销也是一个需要考虑的重要问题。
在并行计算中,处理器之间需要进行通信,传递计算结果和数据,这会导致一定的开销。
为了减小通信开销,人们提出了一些方法,比如数据压缩、异步通信、消息合并等。
基于mpi实现稀疏矩阵的乘法

基于MPI实现稀疏矩阵的乘法1. 引言稀疏矩阵是指大部分元素为零的矩阵,与之相对应的是稠密矩阵,其中大部分元素非零。
由于稀疏矩阵中有大量的零元素,传统的矩阵乘法算法在计算稀疏矩阵乘法时效率较低。
为了提高计算效率,我们可以利用并行计算的思想,使用MPI (Message Passing Interface)来实现稀疏矩阵的乘法。
MPI是一种用于编写并行程序的标准通信库,它定义了一组函数和语义,用于在多个进程之间进行通信和同步操作。
通过将任务划分为多个进程,每个进程负责处理一部分数据,并通过消息传递进行通信和协调,可以实现并行计算。
本文将介绍如何使用MPI实现稀疏矩阵的乘法算法。
首先我们会介绍稀疏矩阵的表示方法和存储格式,然后详细说明基于MPI的稀疏矩阵乘法算法的实现过程。
2. 稀疏矩阵的表示和存储格式稀疏矩阵有多种表示方法,常用的有三元组表示法、行压缩存储(CSR)和列压缩存储(CSC)。
三元组表示法将稀疏矩阵中非零元素的行、列和值分别存储在三个数组中。
这种表示方法简单直观,但对于大型稀疏矩阵来说,空间效率较低。
行压缩存储(CSR)是一种常用的稀疏矩阵存储格式。
在CSR格式中,我们将稀疏矩阵拆分为三个数组:值数组(values)、列指针数组(col_indices)和行偏移量数组(row_offsets)。
其中,值数组存储非零元素的值,列指针数组存储非零元素所在的列索引,行偏移量数组记录每一行第一个非零元素在值数组和列指针数组中的索引。
通过这种方式,我们可以快速访问稀疏矩阵中的非零元素。
列压缩存储(CSC)与CSR类似,只是将列指针数组变为行指针数组,将行偏移量数组变为列偏移量数组。
CSC格式适合于按列访问稀疏矩阵。
在本文中,我们将使用CSR格式来表示稀疏矩阵,并基于该格式实现稀疏矩阵的乘法算法。
3. 基于MPI的稀疏矩阵乘法算法基于MPI的稀疏矩阵乘法算法可以分为以下几个步骤:1.初始化MPI环境:在开始进行并行计算之前,需要初始化MPI环境,获取进程数量和进程编号等信息。
基于GPU的稀疏矩阵向量乘优化

存储器访问(gather or scatter)是影响SpMV效率的重要 方面,而多核架构使存储器瓶颈的问题更加突出。总体来说, 多核架构可以分为通用和专用两类体系结构。在通用架构, 如AMDDual—core,Intel Quad core平台上,主要手段是将局 部数据放入Cache和寄存器(Register)中,调度算法的优劣影 响算法的性能[6-83。而本文所基于的专用结构GPU具有多级 存储器体系[9],需要根据问题的特征设计不同的优化策略,才 能发挥GPU存储器高带宽的优势。
于大规模线性求解系统和求解矩阵特征值等问题[1],尤其在 迭代方法中,SpMv成为影响算法性能的关键步骤。然而, SpMV是典型的存储器瓶颈类运算,即运算/访存比很低,运 算器严重不饱和,难以达到高浮点运算吞吐量。SpMV具有 本质的并行性,利用现代多处理器平台研究并行SpMV是提 高其性能的可行方向之一。
给出了矩阵在CSR结构下的存储示例。
擀3 7 l 4 8
O
r
5/
一
l—r ,一O,
◆一一
9 5 一6 l,,8
图1 CSR结构存储示例 与稀疏矩阵的其他存储格式相比,CSR进行了行压缩, 具有最佳的空间效率,同时能够方便地计算出第i行非零元 素的个数(Ptr[i+1]一Ptr[i])。本文即采用该格式完成 SpMV。
Abstract Sparse matrix computations present additional challenges for hamessing the potential of modem graphics processing unit(GPU)for general—purpose computing.We investigated various optimizations on thread-mapping,data reuse etc.and a paratlel Sparse Matrix-Vector multiplication(SpMV)on GPU with compute unified device architecture (CUDA)was proposed under compressed sparse row(CSR)structure afterwards.The optimizations include:(1)ex-
大规模稀疏矩阵并行计算

非零元的分布带状分布按块分布……正定性对称性
矩阵的存储方式求解方法的选择求解速度……
直接法
矩阵图重排:一般分为两大类,带宽缩减算法(也常称为外形缩减)和区域分解算法,应用较多的带宽缩减算法CM,RCM,GPS,Rosen算法。一般建议多重方法结合使用:全局方法的全局平衡性、局部方法的局部最优特性。符号分解:确定非零元结构以及相应的消元索引,以便在实际数值分解前确定所需存储资源大小,避免数值分解中动态分配存储空间和复杂的索引策略。构建消去树(elimination tree):确定分解节点之间的分解依赖,即确定分解的顺序并构成并行分解的层次结构。
5/31/2024
大规模稀疏矩阵并行计算
10
代数多重网格法方法选择
对于非结构化网格形成的矩阵,SGS,SSOR方法不易并行,即使使用顶点着色技术,因其粗粒度的并行更适合于传统的多核处理器,并不非常适合GPU这样的细粒度并行的架构。Jacobi方法不具有低通滤波性,因此推荐使用damp-Jacobi和PCG方法作为迭代子,其中damp-Jacobi方法的权值一般取为2/3。在最粗网格上的计算推荐使用直接解法。通常对于二阶椭圆边值问题,几何多重网格法具有更好的计算效率以及收敛速度。
5/31/2024
大规模稀疏矩阵并行计算
16
大规模稀疏矩阵GPU计算程序优化设计探索
分支优化 消除分支结构的小技巧 例如: if( a>b ){ a=c; } else { a=0; } 可以替换为: a=( a>b )*c;
5/31/2024
大规模稀疏矩阵并行计算
17
大规模稀疏矩阵GPU计算程序优化设计探索
12
代数多重网格法方法选择
5/31/2024
用三元组表示稀疏矩阵的乘法

该结点除了( row , col , value )以外,还要有以下两个链域:
right: down: 用于链接同一列中的下一个非零元素。
row Down
col
Value right
第十二讲
1 1 3
1 4 5
2 2 -1
3 1 3
图5.23 十字链表的结构
第十二讲
十字链表的结构类型说明如下:
typedef struct OLNode
第十二讲
用三元组表实现稀疏矩阵的乘法运算
第十二讲
两个矩阵相乘也是矩阵的一种常用的运算。设矩阵 M 是
m1×n1 矩阵, N 是 m2×n2 矩阵;若可以相乘,则必须满足矩
阵 M 的列数 n1 与矩阵 N 的行数 m2 相等,才能得到结果矩阵 Q=M×N(一个m1×n2的矩阵)。
数学中矩阵Q中的元素的计算方法如下:
矩阵不仅节约了空间,而且使得矩阵某些运算的运算时间比经
典算法还少。但是在进行矩阵加法、减法和乘法等运算时,有 时矩阵中的非零元素的位置和个数会发生很大的变化。如
A=A+B, 将矩阵B加到矩阵A上,此时若还用三元组表表示法,
势必会为了保持三元组表“以行序为主序”而大量移动元素。
第十二讲
在十字链表中,矩阵的每一个非零元素用一个结点表示,
0 1 N 2 0
2 0 4 0
0 Q 1 0
6 0 4
图5.17 Q=M×N
第十二讲
图5.18 矩阵M、N、Q的三元组表
第十二讲
经典算法中,不论 M [ i ][ k ]、 N [ k ][ j ]是否为零,
for(k=1; k<=n1; k++)
稀疏矩阵向量乘

稀疏矩阵向量乘1.引言1.1 概述稀疏矩阵向量乘是指针对稀疏矩阵和向量进行相乘的一种运算方法。
稀疏矩阵是指其中大部分元素都为0的矩阵,而向量是由一列数值组成的有序集合。
相比于密集矩阵和向量,稀疏矩阵和向量在存储和计算上具有更高的效率。
在现实生活和科学工程领域中,很多数据都呈现出稀疏的特性,比如文本分析中的词频矩阵、网络分析中的邻接矩阵等。
因此,稀疏矩阵向量乘的算法研究和优化具有重要的意义。
本文将首先对稀疏矩阵的定义与特点进行介绍,包括稀疏矩阵的存储方式和稀疏性的度量方法。
然后,我们将详细探讨稀疏矩阵向量乘的算法,包括传统的普通稀疏矩阵向量乘算法以及近年来涌现的一些优化算法。
通过对比实验和性能分析,我们将评估这些算法的优缺点,并探讨它们的适用场景。
在结论部分,我们将探讨稀疏矩阵向量乘的应用领域,包括机器学习、计算机图形学以及科学工程等领域。
同时,我们也将总结本文的主要内容,并展望未来在稀疏矩阵向量乘算法优化方面的研究方向。
通过本文的研究,读者将更深入地了解稀疏矩阵向量乘的算法和应用,并对如何选择合适的算法进行稀疏矩阵向量乘有一定的指导意义。
最终,我们希望本文能够为稀疏矩阵向量乘算法的研究和应用提供一些有益的参考。
1.2文章结构1.2 文章结构本文主要分为引言、正文和结论三个部分。
在引言部分,我们首先对本文的研究对象进行概述,即稀疏矩阵向量乘。
稀疏矩阵是一种特殊的矩阵,其大部分元素为0,只有少数非零元素。
稀疏矩阵向量乘是指将稀疏矩阵与向量相乘的操作。
接着,我们将介绍文章的结构,为读者提供一个整体的预览。
最后,我们说明本文的目的,即探讨稀疏矩阵向量乘的算法和应用。
在正文部分,我们将首先介绍稀疏矩阵的定义与特点。
我们将解释稀疏矩阵的特点,如大部分元素为0、稀疏矩阵的存储方式等。
然后,我们将详细介绍稀疏矩阵向量乘的算法。
我们将介绍常见的算法,如CSR格式、COO格式等,并对这些算法进行比较和分析,寻找最高效的方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第7页 共7页
t=0; j=myid; while t<p do i=(myid+t)%p; k=(myid-t+p)%p; compute if t<>0 send
z ij = Aij x j
;
z ij
to i;
receive
z jk
from k; ;
y j = y j + z jk
else
y j = z jk
第4页 共4页
0 07 0567 01234567 处理器0上的部分和 01 0167 01234567 1 处理器1上的部分和 0127 01234567 处理器2上的部分和 2 12 23 0123 01234567 3 处理器3上的部分和 ⇒ ⇒ ⇒ 01234567 处理器4上的部分和 4 34 1234 45 2345 01234567 5 处理器5上的部分和 处理器6上的部分和 6 56 3456 01234567 7 67 4567 01234567 处理器7上的部分和
稀疏矩阵的矩阵向量乘法的并行算法性能
作者:王舜 指导老师:王小鸽
清华大学计算机科学与技术系 王舜:wangshun98@ 王小鸽:wangxg@
摘 要:现代的科学计算中的最常用的基本算法就是矩阵向量乘法。所以一个快速高效的矩阵向 量乘法的并行算法将给整个科学计算带来诸多的进步。但是随着处理器性能迅速提高和通信速 度发展的相对滞后,并行算法的通信屏障显得越来越明显。而稀疏矩阵带来的问题是,计算量 较小,通信量较大。本文将阐述稀疏矩阵矩阵向量乘法几种的并行实现,以及实现中的计算复 杂度和通信复杂度。通过在计算机机群 ACI 上的测试结果显示出算法性能,并分析了通信量爆 炸对并行算法性能的影响。
;
end; t=t+1; end;
算法分为 p 步,每一步是在各个处理器上根据本地的数据计算出一个 将算出的
z ij
。除了第一步以外,
z ij
发送到相应的处理器上加到结果向量中去,一次一个处理器的通信量为 n p 。这样,
各个处理器的平均通信量降为 ( p − 1) ⋅ n p 。具体的通信方式可以参见图 6。 考虑到稀疏矩阵的特殊数据结构, 当上述改进算法利用到稀疏矩阵上的时候, 需要事先对稀 疏矩阵进行分块定位,找到稀疏子矩阵
t = 2 ρn 2 p ⋅ 1 s + cn log p ⋅ 1 u
对 p 求偏导,得到
∂t 2 ρn 2 1 cn 1 =− 2 ⋅ + ⋅ ∂p s p u p
p= 2 ρn u 2n1 u ⋅ = ⋅ c s c s 。也就是说,处理器个数的最优选择跟两个
由 ∂t ∂p = 0 ,可以得出
因素有关,一是矩阵规模和矩阵密集度,即稀疏矩阵平均每列的非零元个数;二是通信速度和计 算速度的比。首先,对于稀疏矩阵,增大数据规模对于增大并行程序的加速比并没有直接好处, 只要每列的非零元个数保持不变,并行程序的效率就提升不了。更重要的,我们发现了影响并行 程序的加速比的第二个因素。当通信速度滞后计算速度太多,盲目的增加处理器的个数,反而会 降低整个矩阵向量乘法的效率。另外,实际上由于机群中处理器的拓扑结构的限制,它们之间的 多项通信任务不可能完全同时进行,从而实际的通信时间比上述公式里还长。 我们以 ACI 机群和本文前言中提到的项目为一个典型例子,验证上面的分析。首先,很容 易测的 ACI 机群单机的运算能力,它的浮点运算速度可以达到 30MFlops。然后,用 Ping-Pong 法 可以测出机群中两台机器间的通信速度,大概为 4-8MB/s。本文前言中提到的项目中,稀疏矩阵 的每列非零元素个数大约在 7 左右。非零元数值用 float 类型表示,float 类型的长度一般为 4 个字
第5页 共5页
为了解释上述现象,下面我们分析一下算法的复杂度。假设矩阵大小为 n × n ,稀疏矩阵平 均每列的非零元个数为 n1 ,则稀疏矩阵的密集度为 ρ = n1 n 。首先,各个处理器上的计算总量 为 ρn
2
p 次乘法, ρn 2 p + n log p 次加法。由于 n 相对于 p 很大,所以可以忽略 n log p 项,
2
于是各个处理器上的总计算量为 2 ρn
p 次浮点运算。再来考虑通信复杂度,由上可见,整个通
信过程分为 log p 次完成。每次每个处理器都要发送和接受 n 个单位的数据,设一个单位的数据 占 c 个字节,于是各个处理器上的总通信量为 cn log p 。不妨设机群中处理器的运算速度为 s MFlops,通信速度为 u MB/s,。又假设每一步中各个处理器的通信可以同时进行,没有阻塞,互 不影响,达到最高的通信效率。那么整个运算时间(微秒)可用下面的公式表示:
关键字:矩阵向量乘法,稀疏矩阵,并行算法,复杂度,通信
前言
并行计算的基本原理就是将计算任务分散到多个处理器同时进行计算, 以获得成倍的计算速 度。但是由于 p 个处理器并行工作的时候需要花费一些时间进行相互之间的协同和通信,所以并 行程序最终获得的计算速度达不到串行程序的 p 倍。 如今,随着处理器性能的迅速提高,单台计算机的计算能力大大增强。而相比之下,多台计 算机之间的通信速度的提高却相对滞后。这种计算能力和通信能力的不平衡日益增大,越来越妨 碍了并行计算的发展。使得并行计算缩短下来的计算时间大多都用于通信,甚至可能通信时间比 节约的计算时间还长,从而体现不出并行计算的优势。
第6页 共6页
节。按照这些数据计算,并行计算处理器个数的最佳选择 p < 1 。也就是说,这样的情况下,并 行程序起不到加快运算的目的,只能在大量的通信中浪费时间,通信时间比计算时间还多很多。 我们按照上述公式估算出理论值,和实际测得的结果进行比较。图 5 就是对附录 3 中 size=25210 的结果作出的图, 这里的实际值采用的是最优的交替方式的结果, 通信速度取 5MB/s。 可以看出,实际结果和理论值非常接近。
图4 在不同的机群拓扑结构上,不同的通信方式会有不同的效率。在这里,我们尝试了三种不同 的通信方式。 同步方式:每步通信时,所有处理器同时向目标处理器发送数据,然后进行接收。 交替方式:将处理器分成两组,一组先发送数据,后接收;对应的另一组先接收,后发送。 例如 8 个处理器的时候,0、2、4、6 号处理器先发送后接收,而 1、3、5、7 号处理器先接收后 发送。 轮转方式:将处理器看成环状排列,起始节点先发送,后面的节点都是接收到前面节点的数 据以后,再向后继节点发送数据,最后一步是由起始节点接收末尾节点的数据。 比较这三种方式,其中同步方式可能的通信冲突最多,而轮转方式则浪费的等待时间最多, 交替方式的通信冲突和通信等待时间介于这两者之间。对于这三种方式,我们在 ACI 机群上做了 很多实验(ACI 机群的配置参见附录 2),得到结果列于附录 3 的表格中,其中 MPI 方式是指利 用标准的 MPI_Allreduce 接口函数实现通信。 从上述结果和图示可以看到, 同步方式和轮转方式在处理器增多的时候效果都很差。 前者是 因为处理器增多造成通信阻塞增多;后者的通信实际上是按照串行方式进行的,处理器越多,浪 费的等待时间也就越多。这样看来,交替方式是效率最高的方式,跟 MPI_Allreduce 接口函数的 效率不相上下,甚至更好。 另外,上述结果中,我们可以看到很重要的一点就是,在 ACI 机群上,并行矩阵向量乘法 的时间不仅和矩阵规模成正比,还随着处理器个数增加而变长,并没有达到并行运算的目的。
二、基本的算法及其性能分析
按照矩阵向量乘法的定义, 所示。
y i = ∑ j Aij x j
,如果记
z ij = Aij x j
,则有
yi = ∑ j z ij
,如图 2
第2页 共2页
图1
图2
第3页 共3页
图3 一个最基本简单的算法就是, 各个处理器根据自己拥有的独立数据, 进行矩阵非零元和向量 中相应位置元素的乘法和累加,可以分别计算出结果向量的部分和。例如,第 j 个处理器上拥有
一、稀疏矩阵的数据结构
首先,为了讨论方便,我们给出稀疏矩阵和向量的数据结构。稀疏矩阵的数据结构由图 1 表 示,具体 C 语言定义参见附录 1。整个矩阵按照列块分布在各个处理器上,即每个处理器上仅拥 有稀疏矩阵的连续几列。按列分布的原因上面已经讲到,是在一个大的科学计算项目中,别的并 行运算决定的。 而向量是密集的,其定义相对简单,用数组表示即可,在每个处理器上都保留完整备份。
∗
图5
三、改进的算法
A (对所有i ) x j 考虑到上述计算中,第 j 个处理器需要的数据实际上只有 ij 和 ,我们可以只
在各个处理器上保留部分的向量,不仅对于原向量,也对于结果向量。这样一来,上述的向量求 和过程中,各个处理器只需要的其他处理器上相应的一段向量即可。 另外,为了进一步提高效率,可以将通信安排在计算过程中间进行,使得与计算获得最大的 重合。算法描述如下:
Aij
在原矩阵中的列起始位置。在这里我们的作法是对每
个矩阵在所有运算开始前,预先计算出一个伴随结构,记录每列对于各个分块的起点,终点和长 度,方便后面的计算。 改进后的方法的效率同样列在附录 3 的表格中,并行速度有了明显的提高,比未改进时用标 准的 MPI_Allreduce 接口函数和交替方式都快很多。但是加速比上不去的缺陷还是存在。我们仍 然对改进后的方法进行理想情况下的复杂度分析。得到
Aij (对所有i )
和整个向量,依据这些数据我们可以得到
z ij (对所有i )
。最后可以通过多个处理
器的交互通信,把这些结果加到一起,如图 3 所示。 我们采用下面的通信方式, 完成这样分布在多个处理器内存上的向量的加法。 不妨设处理器 个数 p = 2
k
,算法描述如下:
i=1; while i<p do dest=(myid+i)%p; src =(myid-i+p)%p; send vector v to dest; receive vector v1 from src; v=v+v1; i=i*2; end; 如此,一个 8 处理器的系统将按图 4 所示步骤完成向量求和。