利用并行计算机实现软件和硬件上的并行算法的主要步骤和层次程序员
第5层是指应用层,在这一层里描述的是须要并行计算平台实现的应用和问题。对应所需的输入和输出的格式也在这层进行定义。某些输入和输出(I/O)接口的描述还须要考虑数据存储的位置和时间的相关性。这一层的结果会被更低一层采纳以便指导并行算法的开发工做。 第4层是算法开发层,这里须要考虑到应用在问题中的实现。须要应用实现的计算内容决定了算法的具体任务和任务之间的相互依赖关系。在这一阶段的程序,算法的并行性并不必定会显现出来,由于在探索算法子任务执行的时候仍然在运用传统的线性思考。在这一阶段,也不须要考虑子任务的时间调度和处理器分配的问题。可能在这阶段就将这些问题解决的作法看起来很诱人,可是这样作会拔苗助长,由于这会掩盖程序中潜在的并行性。该层的结果是一个依赖图,或是一个有向图,或者是一个归纳了任务之间依赖关系的邻接矩阵。 第3层是并行化层,在这一层将试着释放算法中潜在的并行性。这一层接收了第4层对算法的描述而且给出了基于软件实现的线程时间调度和处理器分配。另外一种选择是在这一层进行基于超大规模集成电路的硬件实现的任务调度和处理器分配。 第2层是代码层,在本层中并行算法用高级语言表示为代码。使用何种语言取决于目标并行计算在何种平台执行。 第1层的目标是算法的实现,或是在并行计算机平台的应用。实现的途径能够是在并行计算平台上使用多线程,也能够是在特定用途集成电路(ASIC)上或者现场可编程门阵列(FPGA)上使用特定的应用并行处理系统。
表示某个算法的有向无向图算法
- 一般用有向图(DG)来直观表示算法的子任务之间的数据依赖关系。DG在描述算法的时候表示依赖图,须要用带箭头的线段强调子任务之间的数据流向关系。
- 定义1:一个依赖图是边和结点的集合。结点表示算的子任务,边表示子任务用到的数据。数据包括输入、输出和中间结果。
- 注意:在一个依赖图中出现的不带箭头的边表示此边链接的两个结点之间没有数据依赖关系,它们只是共用算法中的某一个变量。这个变量能够是输入、输出或者在算法中做为I/O媒介的中间结果。
- 定义2:DG是有向边和结点的集合。结点表示算法须要处理的子任务,有向边表示子任务之间的数据依赖关系。一个子任务的输出在一条边的开端部分,箭头指向的一端表示一个子任务的输入。
- 定义3:有向无环图(DAG)是指一个没有任何环路的DG。
- 定义4:一个DG中的输入边是指只有目标结点而没有任何源结点的边,表述了算法的一个输入。在图中能够看到有3条这样的输入边,分别表示输入in0、in1和in2。
- 定义5:一个DG中的输出边是指只有源结点而没有目标结点的边,表达了算法的一个输出。在图中能够看到有3条这样的输出边,分别表示了输出out0、out1和out2。
- 定义6:一个DG中的内部边是指既有源节点又有目标结点的边,表达了算法的一个内部变量。
- 定义7:一个DG中的输入结点是指全部的入边都是输入边的结点。在图中能够看到0、一、2都表示输入结点。输入结点所表示的子任务在算法输入变量就绪后就被处理。
- 定义8:一个DG中的输出结点是指全部的出边都是输出边的结点。在图中能够看到结点7和9都表示输出结点。可是结点3不是输出结点,由于结点3的一条出边是指向结点7的内部边。
- 定义9:一个DG中的内部结点是有至少一条入边和至少一条出边的结点。
根据子任务的依赖关系能够大体将算法分为以下几类:编程
- 串行算法的特色是因为相互之间存在数据依赖关系,子任务必须一个一个地按顺序执行。这一类算法的DG是由一系列相互关联的子任务构成的队列。图中展现了一个串行算法的DG。此算法是用来计算斐波那契数列的。为了获得n10,子任务T10进行了以下计算:n10=n8+n9。在此n0=0和n1=1是初始条件已经给出。很明显,为了获得某一位的斐波那契数只能计算在它以前的数。
- 并行算法的特色是因为相互之间不存在数据依赖关系,子任务能够同时并发执行。此算法的DG就像是许多独立的子任务组成的一组任务,相互之间没有联系。图中展现了一个并行算法的DG。Web服务器上的数据处理应用就是一种简单的并行算法,每一次数据请求都被看作独立的任务交给不一样的处理器来响应。同时运行浏览器,字处理程序等多个程序时操做系统的多任务调度算法也是一种并行算法。
- SPA的特色是子任务被分配至不一样层次,每一个层次以内的子任务能够并发执行,可是各个层次需按照必定的顺序执行。当须要执行的层次只有一层时,这个SPA就是并行算法。当每一层都只有一个子任务时,这个SPA是串行算法。图中展现了CORDIC算法的DG,CORDIC算法就是一个典型的SPA,它有n层迭代,在第i次迭代时须要执行如下运算:
- xi+1=xi+myiδi
- yi+1=yi-xiδi
- zi+1=zi+θi
- 在此等式中x,y和z都是进行迭代的数据,每次迭代以后都会被更新。δi和θi是存在表单中的常量。m是用来控制计算类型的参数,θi的数值是预设的,与i有关。此算法每次迭代都会进行这三项操做。
- NSPA不属于上述分类中的任何一种,NSPA算法的DG也没有规律可循。根据算法DG是否有环将NSPA分为两类:①DAG;②有向有环图(DCG)。
- 图中分别展现了一个DAG算法和一个DCG算法。DCG算法常见于离散时间回馈控制系统。输入信号做为子任务T0的初始滤波或者输入信号条件。子任务T1的输出一般是错误信号,而后这个信号会做为一种反馈输入子任务T2中。
- NSPA的依赖图有两种典型构造:结点用来表示构成算法的子任务,有向边则表示子任务之间的数据流向。一个结点的一条出线表示输出,入线表示输入。若Ti的输出指向Tj,则代表Tj依赖于Ti。在图中则用“结点i的一条有向边指向结点j”来表示这种依赖关系。
一个算法的DG有以下3个重要属性:浏览器
- Work任务数(W)表示算法完成须要处理的子任务总数。
- Depth深度(d)表示任意一个输入结点到任意一个输出结点之间的最大路径长度,也被称为关键路径。
- Parallelism并行度(P),也称为并行程度,表示能够并发执行的最大结点数。由此数据能够决定该算法须要的处理器的数目不会超过P,保证算法执行过程当中不会出现没必要要的处理器。
- Karp等介绍了RIA的概念。这类算法的涵盖范围很广,包括信号处理,图像和视频处理,线性代数应用,以及基于网格结构的数字模拟程序。上图是一个RIA的依赖图,用作示例的是图像匹配算法。对于RIA算法,此处不使用DAG来表示,而是用依赖图的概念来表示。
- 依赖图和DAG相似,可是依赖图中的链接边是无向边而非有向边。
- RIA中的任务之间的依赖关系图十分复杂。串行算法和并行算法,甚至SPA算法的并行度计算都不复杂。且RIA算法的并行计算很是困难。
矩阵相乘算法就是一种简单的RIA算法:服务器
要求:输入矩阵A和B
1 for i=0:I-1 do 2 for j=0:J-1 do 3 temp=0 4 for k=0:K-1 do 5 temp=temp+A(i,k)×B(k,j) 6 end for 7 C(i,j)=temp 8 end for 9 end for 10 RETURN C
- 该算法中出现的变量和算法的因子i、j、k有着正则依赖关系。通常状况下此类算法经过依赖图来进行研究,依赖图能展现须要执行的子任务之间的关系。当算法只有1个或者2个因子时,依赖图的展现很是直观。可是矩阵相乘的算法中出现了3个因子,所以它的依赖图是三维的,很难直观表示。
- 在设计并行计算系统时须要注意的一些重要问题。
- 处理器之间的通讯应该采用内部互联网络。此网络应该有能力支持任意两个处理器之间的即时通讯。
- 任务分割表示将原始程序或应用分为几个程序段,以便稍后将这些程序段分配至各个处理器上。
- 粗粒度分割是指分配至各个处理器的程序段体积较大。
- 细粒度分割则是指程序段的体积较小。
- 程序段能够是不一样的软件进程或者是线程。由程序员或者是编译器决定分割方式。程序员或操做系统必需要确保子任务的同步执行以保证程序的正确性和数据的完整性。