1、本文研究得到国家高技术研究发展计划863(No. 2006AA01Z105)、国家自然科学基金(No.60373008)和教育部重点基金(No.106019)资助.作者简介:王珏,男,1981年生,博士研究生,主要研究方向:并行计算与并行编译技术.胡长军,男,1963年生,博士,教授,博士生导师,主要研究方向:并行计算与并行编译技术,并行软件工程、网络存储体系结构、数据工程与软件工程.张纪林,男,1980年生,博士研究生,主要研究方向:并行计算与并行算法.李建江,男, 1971年生,博士,副教授,主要研究方向:并行计算、并行编译与多线程技术.本文联系人:王珏,电话:(010)62334522,
2、13520541361,E-mail: ,联系地址:北京市学院路30号 北京科技大学信息工程学院 135信箱 王珏 邮编:100083一种数据并行中的群通信优化策略王珏 , 胡长军 , 张纪林,李建江(北京科技大学信息工程学院 北京 100083)摘 要: 群通信是影响大规模数据并行系统效率的关键因素,其主要发生在程序不同阶段间的数组重分布与循环划分后的数组重映射这两种情况.在一次通信中显著影响群通信效率常被忽视的因素是消息冲突和消息长度的不一致.因为它们会导致进程间大量的空闲等待时间.然而以前的研究要么不能完全避免消息冲突,要么针对某些特殊情况.对此,提出了在数组分布为 Block_Cycl
3、ic(k)情况下的一种更具有普遍适用性的通信调度策略 CSS. 通过证明表明该策略能使一个通信步内的消息互不冲突且消息长度尽量相等.从而最小化通信调度生成时间和实际通信时间.最后的测试结果也表明,与传统的通信优化算法和 MPI_Alltoallv 实现相比,CSS 策略使得通信效率得以明显提高.关键词: 并行编译;数据并行;组通信;数组重分布;分布内存1 引言当前大多数并行应用系统都是采用基于分布式内存的数据并行范例.群通信在数据并行程序中普遍存在并且是影响其执行效率的关键因素.群通信主要发生在以下两种情况:程序的不同阶段间的数组重分布和循环划分后的数组重映射.许多数据并行编程语言,例如HPF
4、1、Vienna Fortran2和 p-HPF3等,都是通过在分布内存下提供数组分布指导支持全局命名空间(global name space) .在这些语言中,程序员通过指导语句来指定数组在处理器间的分布模式.根据“拥有者计算”原则,编译器利用这些分布信息和循环中数组赋值语句来产生通信集.许多时候由于通信代价过高而导致并行效率很低,甚至出现负加速比.针对这些典型问题,越来越多的研究者将通信优化的研究重点放在如何最小化通信集生成的时间 45、重叠通信与计算 6以及重分布数组上,不过他们却忽略了由于结点间消息冲突和一次通信中消息长度不一样所带来的大量通信开销。另外,通过对消息进行调度减轻通信代价
5、的研究有:Park 等人 7在考虑数据传输、通信调度和索引计算的基础上提出了一个针对某些特例减少通信总时间的算法,不过它只是针对某些特例.Desprez 等人 8给出了一个最小化消息冲突的算法,但该算法仍然不能避免通信冲突.X. Yuan 等人 910提供了一个基于 MPI_Alltoallv 实现的通信调度算法, 但是其运行时的开销很大. M. Guo 等人在以前工作的基础上 11给出了关于一维数组的重分布通信调度策略,其中目标数组在发送处理器组 Q 和接收处理器组 P 上具有不同分布形式 12,然而该研究只是着眼于并行程序不同阶段之间数组的重分布问题,并不能解决循环划分之后的数组重映射问题
6、.与以往的研究相比,本文的主要贡献有以下三点:(1) 本文提出的策略首次解决了循环划分后在数组重映射时出现的消息冲突问题.其避免了数组重映射时结点间的消息冲突,同时也最小化了每步通信所花费的时间.(2) 本文提出的策略更具有普遍性,也适用于不同阶段的数组重分布.(3) 本文提出的策略引入关于通信表的周期性理论,大幅度减低通信调度生成的时间.因此有利于该通信调度算法在编译阶段实现,不会带来额外的运行时开销.2综上所述,本文给出了一种不仅具有普遍适用性,而且空间和时间花费很小,可以用于编译时完成的通信调度策略 CSS(Communication Scheduling Strategy). 为了更好
7、地描述问题,文中使用通信表 COM(COMmunication)table 和调度表 CS(Communication Scheduling)table( 表的定义在第二部分给出)来分别描述处理器间的消息交互模式和消息的调度情况.首先引入通信表的周期性理论来缩短通信调度表的生成时间,然后给出与通信表内元素递推关系相关的定理和推论的证明.在以上定理和推论的基础上,构造出有效的调度算法使调度表的每一列变成接收处理器序号的枚举,并尽量把长度相近的消息放到同一个通信步内.CSS 策略既避免了处理器间的通信冲突,同时也最小化了调度表的生成时间和实际通信的总时间.为了便于算法描述,本文主要是以一维数组为例
8、进行说明,该策略很容易扩展到多维数组的情况.本文余下部分的组织如下:第二部分介绍所要解决的问题并举例进行说明;第三部分是本文的核心内容,论述了处理器间的通信调度策略;第四部分给出在分布式内存机群上的测试结果并进行分析;最后是结论及进一步的研究工作.2 问题的描述本节首先给出一段代码抽象,然后在此基础上给出了 MPI_Alltoallv 和传统方法的实现.以一段 HPF 代码抽象为例 (如图 1 所示).数组 A 和 B 分别以 cyclic(x)和 cyclic(y)分布到不同的处理器组 P 和 Q 上. 1*i +b1 和as2*i +b2 分别是数组 A 和 B 的访问函数,且二者均为线性
9、函数.F 是一个数组函数或者数组as固有函数(intrinsic function) (如: 数组转置操作 13).编译器可以通过数组分布和 FORALL 语句所提供的信息来产生通信集和通信代码 14. 图 1 代码抽象中的符号说明详见表 1.图 2(a)为图 1 代码抽象的一个实例,其中数组 A 以 cyclic(4)分布到 5 个处理器上,数组 B 以 cyclic(3)分布到另外的 5 个处理器上,即 n =182、n =120、n = abpn =5、n =60、x=4 、y=3、 1=3、 2=2、b1=4、b2=1.qs表 1 图 1 中代码抽象的符号说明符号 符号说明 符号 符号
10、说明n a数组 A 中元素的个数 b1 数组 A 中访问函数的参数n b数组 B 中元素的个数 a2 数组 B 中访问函数的参数n p处理器组 P 中处理器的个数 b2 数组 B 中访问函数的参数n q处理器组 Q 中处理器的个数 x 数组 A 以 cyclic 分布的参数n sFORALL 语句的循环上限 y 数组 B 以 cyclic 分布的参数a1 数组 A 中访问函数的参数 i s循环变量2.1 通信表、通信调度表和通信冲突的定义下面给出关于通信表、通信调度表和消息冲突的定义.1. real A(0:(n -1) ),B(0: (n -1) )ab2. !processor P(0:(
11、n -1) )p3. !processor Q(0:(n -1) )q4. !distribute A(cyclic (x) )onto P5. !distribute B(cyclic(y) )onto Q6. FORALL(i = 0:(n -1) )ssA( 1*i +b1)= aF(B( 2*i +b2) )s图 1 HPF 代码示例3定义 1 通信表(Communication Table): 用来描述源处理器组与目标处理器组之间的通信模式.例如,图 2(b)为图 2(a)中的循环语句根据“拥有者计算”原则划分后所产生的通信表,表中 表示处理器 Q 发送到处理器 的消息大小, 有 .
12、)j,i(COMi jP0)j,i(COM定义 2 调度表(Communication Scheduling Table): 用来描述处理器间通信调度的结果.如图 3(a)和图 3 (c),其中 CSik=j 表示发送处理器 Q 在第 k 步发送消息到接收处理器 .i jP定义 3 消息冲突(也称通信冲突): 当几个发送处理器同时发送消息到同一个接收处理器时,接收处理器端便会产生瓶颈.本文所提出的定理对消除消息冲突具有普遍意义.本文的通信调度策略对于不同阶段的数据分布(例如,cyclic(3)到 cyclic(4)分布)同样适用. 图 2(c)给出了 cyclic(3)到 cyclic(4)重
13、分布的通信表 COM.其中,发送处理器组和接收处理器组分别包括有 5 个处理器,并且数组分别以 cyclic(3)和 cyclic(4)分布在上面.只要使图2(a)中 1= 2=1 和 b1=b2=0,即让循环中的赋值语句变为 Ai=Bi,其所得的通信表也为图a2(c).因此,本文提出的通信调度策略同样可应用于不同阶段的数组重分布,数组重分布是该策略所解决问题的一个特殊形式.0 1 2 3 4 0 2 2 3 3 2 1 3 3 2 2 22 2 2 2 3 33 2 3 3 2 24 3 2 2 2 3C O MQ iP j0 1 2 3 4 0 3 3 2 2 2 1 2 2 3 3 22
14、 3 2 2 2 33 2 3 3 2 24 2 2 2 3 3C O MP jQ i2.2 MPI_Alltoallv和传统方法的通信调度实现当发送处理器和接受处理器个数不同时(即Many_to_Many 通信方式), MPI_Alltoalllv实现虽然有一些处理器的发送数据大小被设置成零,但是仍然有启动时间上的浪费.为了解决这一问题,图3中的代码 11可以是在实现Many_to_Many通信时对MPI_Alltoallv的一个简单而实用的替换.其中myid是当前执行的进程号.在发送阶段和接收阶段中,当前进程采用非阻塞方式进行消息传递.该实现使得发送处理器在一开始以不同的处理器作为目的处理
15、器,这在某种程度上能够简单地减少消息冲突. 采用上述方法,由例1的代码,可以得到图4(a)中的通信调度表 .图4(b)是各处理器在图4(a) 调度下的通信状态图.其中水平长条编有数字j,代表发送处理器发送消息到接收处理器 P (处理器组P 中的第j 个处理器).一个块是一个j接收阶段:for p=0 to n -1 dopsrc =(myid+p )mod n ;pnon-block receive End do发送阶段:for q =0 to n -1 doqdest =(myid+q )mod n ;qpack end dowaitall;图 2 例 1 及其通信表和 cyclic(3)到
16、 cyclic(4)分布的通信表(b)由图 2(a )所产生的通信表 (c) cyclic(3)到 cyclic(4)分布的通信表(a)例 1real A(0:181),B(0:119)!processor P(0:4)!processor Q(0:4)!distribute A(cyclic(4) )onto P!distribute B (cyclic(3) )onto QFORALL (i =0:59) sA3*i +4=B2*i +1;s图 3 传统通信代码实现4消息传输的单元,连续的一段带有相同数字j的块数代表发送处理器发送给接收处理器P 的j消息长度.可以看到图4(b)中的灰色块代
17、表存在消息冲突的部分 ,它们会大幅度降低通信效率.本文的目的之一就是通过设计有效的算法,消除这些冲突,图4(c)是经过改进后的通信调度表,图4(d)是其相应的通信状态图,可以看出改进后的通信调度有效避免了消息冲突 .1 2 3 4 5 0 0 1 2 3 4 1 1 2 3 4 02 2 3 4 0 13 3 4 0 1 24 4 0 1 2 3C SQ ik0 0 0 2 2 41 12 3 32 3 3143 0 0233 42 4414 41 3 02 0 10 13 4 04 10 13 2 21 24 0 04 10 14 2 32 31234c o n t e n t i o n0
18、 1 2 3 4r e c e i v i n g p r o c e s s o r1 2 3 4 5 0 0 1 2 3 4 1 3 4 0 1 22 1 2 3 4 03 4 0 1 2 34 2 3 4 0 1C SQ ik0 0 0 2 2 43 41 2 32 3 3110 1 2423 40 1413 33 0 21 4 04 04 0 10 21 14 2 32 32 3 43 04 42 0 10 11234c o n t e n t i o n0 1 2 3 4r e c e i v i n g p r o c e s s o r为了得到上述改进后的通信调度表,下一节将给出
19、一个更具有普遍适用性的通信优化策略.该策略在避免处理器间通信冲突的前提下,能够最小化调度表的生成时间和实际通信的时间.3 CSS 通信调度策略本节仍旧针对图 1 的代码抽象,首先给出其访问模式的周期性公式,然后论述通信表的周期性引理和在一个周期内通信表内元素递推关系的定理及推论,最后根据这些定理和推论分情况给出通信调度算法.3.1 访问模式的周期性公式在图 1 的代码抽象的基础上(本节中一些变量,如 n 、n 、n 、n 等的定义可以参abpq考第二节中的表 1),假设 g 是数组 B 中某个元素的全局地1-c0|2b*as址,并且该元素在处理器 (处理器组 Q 中的第 i 个处理器)上,其相
20、应的数组 A 的元素在i处理器 (处理器组 P 中的第 j 个处理器)上,则 i 和 j 由如下公式给出:jqnmod)yivg(i(1)(a)例 1 的通信调度表 (b) (a)对应的通信状态图 (c)改进后的通信调度表 (d) (c)对应的通信状态图 图 4 与图 2(c )对应的通信调度表和通信状态图5(2)pnmod)xiv)1ba*2g(j为了最小化 CSS 策略的时间,下面给出了数组分布和赋值语句的周期公式 :period =lcm(n *x, 1)/ 1 Aep a(3)period = lcm(n *y, 2*period ) sqAe(4)period = period /a
21、2 erti s(5)公式(3)中的 period 表示数组 A 迭代访问模式的周期 .公式(4)中的 period 是数e s组 B 索引形式的周期.公式( 5)中 period 是整个循环迭代模式的周期.div 代表整除,moderti代表取余, lcm 代表最小公倍数 .通过图 2 中的代码来说明上述周期公式.数组 A 和 B 分布分别以 cyclic(4)和 cyclic(3)分布到处理器组 P 和 Q 上.图 5 给出了图 2 中代码的数组访问模式.在图 5 中,对于赋值语句 A(3*i +4)=B(2*i +1), 当 i =0 时, B(1)在 Q 上并发送给 P (A(4)ss
22、s01所在的处理器).在小长方形竖条中的数据 (个数为 period =20)即代表数组 A 的一个迭代访Ae问模式. period =60 ( )是整个循环迭代模式的周期, 即 Qi 与 Pj 组合的周期.erti 59i0s6i s 3 * i s 2 * i s D e s t S r c+ 4 + 10 4 1 P 1 Q 01 7 3 P 1 Q 12 1 0 5 P 2 Q 13 1 3 7 P 3 Q 24 1 6 9 P 4 Q 35 1 9 1 1 P 4 Q 36 2 2 1 3 P 0 Q 47 2 5 1 5 P 1 Q 08 2 8 1 7 P 2 Q 09 3 1
23、1 9 P 2 Q 11 0 3 4 2 1 P 3 Q 21 1 3 7 2 3 P 4 Q 21 2 4 0 2 5 P 0 Q 31 3 4 3 2 7 P 0 Q 41 4 4 6 2 9 P 1 Q 41 5 4 9 3 1 P 2 Q 01 6 5 2 3 3 P 3 Q 11 7 5 5 3 5 P 3 Q 11 8 5 8 3 7 P 4 Q 21 9 6 1 3 9 P 0 Q 32 0 6 4 4 1 P 1 Q 32 1 6 7 4 3 P 1 Q 42 2 7 0 4 5 P 2 Q 0i s 3 * i s 2 * i s D e s t S r c+ 4 + 12
24、3 7 3 4 7 P 3 Q 02 4 7 6 4 9 P 4 Q 12 5 7 9 5 1 P 4 Q 22 6 8 2 5 3 P 0 Q 22 7 8 5 5 5 P 1 Q 32 8 8 8 5 7 P 2 Q 42 9 9 1 5 9 P 2 Q 4 3 0 9 4 6 1 P 3 Q 03 1 9 7 6 3 P 4 Q 13 2 1 0 0 6 5 P 0 Q 13 3 1 0 3 6 7 P 0 Q 23 4 1 0 6 6 9 P 1 Q 33 5 1 0 9 7 1 P 2 Q 33 6 1 1 2 7 3 P 3 Q 43 7 1 1 5 7 5 P 3 Q 03 8
25、1 1 8 7 7 P 4 Q 03 9 1 2 1 7 9 P 0 Q 14 0 1 2 4 8 1 P 1 Q 24 1 1 2 7 8 3 P 1 Q 24 2 1 3 0 8 5 P 2 Q 34 3 1 3 3 8 7 P 3 Q 44 4 1 3 6 8 9 P 4 Q 44 5 1 3 9 9 1 P 4 Q 0 i s 3 * i s 2 * i s D e s t S r c+ 4 + 14 6 1 4 2 9 3 P 0 Q 14 7 1 4 5 9 5 P 1 Q 14 8 1 4 8 9 7 P 2 Q 24 9 1 5 1 9 9 P 2 Q 35 0 1 5 4 1
26、 0 1 P 3 Q 35 1 1 5 7 1 0 3 P 4 Q 45 2 1 6 0 1 0 5 P 0 Q 05 3 1 6 3 1 0 7 P 0 Q 05 4 1 6 6 1 0 9 P 1 Q 15 5 1 6 9 1 1 1 P 2 Q 25 6 1 7 2 1 1 3 P 3 Q 25 7 1 7 5 1 1 5 P 3 Q 35 8 1 7 8 1 1 7 P 4 Q 4 5 9 1 8 1 1 1 9 P 0 Q 46 0 1 8 4 1 2 1 P 1 Q 06 1 1 8 7 1 2 3 P 1 Q 16 2 1 9 0 1 2 5 P 2 Q 16 3 1 9 3 1
27、 2 7 P 3 Q 26 4 1 9 6 1 2 9 P 4 Q 36 5 1 9 9 1 3 1 P 4 Q 36 6 2 0 2 1 3 3 P 0 Q 4 3.2 通信表的周期性引理和表内元素递推关系的定理及推论为了最小化通信调度算法的计算量,本节利用上述数组访问模式的周期性特点给出通信表的周期性引理.引理 1. 在 COM 表中,对于任意的( , )有 COM( i,j)= u ,如果数组访问正iQjP0好是一个周期,那么当数组访问是周期的 k(k 是正整数)倍时,即 k* period ,有ertiCOM(i,j)=k*u.证明:见附录 A. 由引理 1,可以知道 COM 表和 C
28、S 表都是周期性变化的.此处仍然以图 2 中代码为例, 当 n = period =60 则有 COM (0, 2) =3,进一步如果 n =k*period =k*60, 则有 serti sertiCOM(0,2)=k*3.为了便于说明 ,本文将只讨论一个周期的情况( 也就是 n = period ).对于多itr个周期的情况,调度算法同样适用.下面将给出通信表内元素递推关系定理和推论,本文的通信调度算法主要是基于该定理和推论构建的.为了帮助理解该定理 1 和推论 1、2,继续以图 2 中代码为例进行说明.当图 5 图 2 中代码的数组访问模式7COM(0,2)=3(相应的 COM 表在图
29、 2(b)中), 对于数组 B 在一个周期里存在 3 个不同的全局地址 17、31、45,它们都是在处理器 上并且需要被发到处理器 .上述三个元素在图 5 中0Q2P用椭圆虚线标出.一定存在 M=24 使得 B 数组的另外三个元素41(=17+M)、55(=31+M)、69(45+M)在处理器 上并需要发送给 ,也就是 COM(3,1)=3.这31三个元素在图 5 上用实线椭圆标出.依次类推,有如下关于数组 B 的全局地址: (17+24*k) mod , (31+24*k) mod , and (45+24*k) mod | speriodsperiodsperiod, =120, M=24
30、是分别在处理器 (i=1, 4, 2)上并且需要发给处M/rik2s iQ理器 (j=0, 4, 3),也就是 COM (1, 0) = COM(4,4)=COM(2,3)=3.通过上述分析,可以知道通信jP表内存在元素的递推关系,下面给出相关定理和推论的证明.其中部分符号的说明可以参考第二节中的表 1.定理 1. 假设数组 A 和数组 B 分别以 cyclic (x)和 cyclic (y)分布到 n 和 n 个处理器上,pq那么 ,其)ts(lcmk0,u)modn*kj(,od)*ki(COMu)j,i( pq 中 ,x*2a1nym ,1ax)2ylclm/gdt(/gcsppqq同时
31、有 )t,s(lck0,u)nod*kj(,nod)*ki( pq ,)j,i(其中 ,xn,y*1a ,2ay1),xlc lc n/s qq.)(/gcdt pp证明:见附录 A. 在定理 1 中,给出了两个通信表中元素的递推公式,其中 gcd 代表最大公约数,m、n、M、s、t、m、n、 M、s 、t均为系数,其余符号的说明可以在第二节中的表 1中获得.由递推公式得到的通信表中的元素都相等.为了更好地说明算法,下面给出定理的两个推论:推论. ,1ax)*2,y(lcm*l(M,x*2a1n,ym.),(l2 l(,.n,证明: 见附录 A. 其中的 a1、a2、x 和 y 可以参考第二节
32、中的表 1.通过推论 1,可以得到定理 1 中两个递推公式中系数的关系.由于 ,所以在通信调度算法中只需要使用第一个递推公,m8式来计算和.推论. n *n = lcm (s,t) COM 中的所有元素相等.pq证明: 见附录 A. n *n 为整个通信表中元素的总个数.由于其与定理 1 中所能递推到的所有 lcm (s,t)个pq元素个数相同,所以 COM 中所有元素相等,此时采用传统的通信调度算法就可以得到好的效果.3.3 通信调度算法本节根据( 是否成立将通信调度策略分成算)n,mgcd(q )n,gcd(/1qpp法 1 和算法 2 两部分.根据定理 1,当( 成立时,每m)n,gcd
33、(/1qpp一个发送处理器都会在同一步内发送相同长度的消息到不同的接收处理器.由此给出下面算法:算法 1.当( 成立时.)n,gcd(q )n,gcd(/1qpp输入:1) COM 表.2) 数组分布模式和循环变量(例如图1中的n 、n 、n 、n 、n 、x、y、 1、 2、b1和b2,符号说明参见表1和定理1). abpqsa输出:1) CS 表.步骤 1:对于某一个发送处理器 Q (以 Q 为例,即 i0 =0),它所对应 CS 表的第 i0 行设为接收0i处理器号的一个任意排列( 以 CS0=,为例).p步骤 2:对于 CS 表 i0 行所对应的每一个接收处理器,都有)m*ki(COM
34、u)ji(,nodq ,u)nmod*kj(p.通过 CS 表中的第一行元素就可以递推得到整个改进后的 CS 表.t,slcmk0本节通过两个有代表性的例子(图 2 例 1 和图 6 例 2)来说明算法 1 的具体实现细节.对于例,有 period =120,m=8, n=9 s ,5od)8*ki(,u)5od9*kj(.由于 ,初始化 CS=,CS01=0 5k0)59gcd(1)5,8gcd(表示在第 1 步中 Q 发送消息到 P 上,通过定理 1 可以得到 COM(0,0)=COM(3,4)00=COM( 1,3)=COM(4,2)=COM(2,1),即 CS1=,.同理,CS 的其9
35、余列可以被得到,即 CS2=,CS3=,CS4=, , ,CS5=,.例的循环如图 6(a)所示.数组 A 以 cyclic(4)分布到 9 个处理器上,数组 B 以cyclic( 5)分布到另外的 3 个处理器上 ,即,其通信表 COM 如图 6(b)所示. 3n,5yx,1b2,4,2a,31 qp由 period =240,m=16,n=15 可以得到 s ,mod)16*ki(COM.因为 ,通过算法 1 可以3k0,u)9mod15*kj( 3)9,5gc(3,gcd得到图 6(c)所示的通信调度表 .0 1 2 3 4 5 6 7 80 2 3 2 2 3 2 1 4 1 1 2
36、3 2 1 4 1 2 3 22 1 4 1 2 3 2 2 3 2C O M1 2 3 4 5 6 7 8 90 0 1 2 3 4 5 6 7 81 6 7 8 0 1 2 3 4 52 3 4 5 6 7 8 0 1 2C S从定理 1, 能够看出 ) 和 分别是/gcdns(qn,m(q )n,(/gcdt(pp和 的周期.COM 表( 例如图 7(b)能够被划分成qnmod)*ki(po)*kj个子矩阵,每个子矩阵有相同的大小,即 ,该 COM 表如下所示:ts t/*s/pq,1t,s1,s0,1s t., 1,010C.COM 1t/n,sc.1,s/cn0,s/ . ,., t
37、/0pqqqpji这些子矩阵 C 可以被划分成 f (= /lcm (s,t)组, 每个组有 lcm (s,t)个相同的子矩阵. j,i *当 为真,也就是)nm(/gcdn(sqq ),(/gcdt(qpp.下面给出一种启发式的算法 2 来对该情况进)1, )n,gcd/qp行通信调度.算法 2 首先对每个组进行遍历,随后遍历组内的每个子矩阵,最后遍历子矩阵内的每个元素,具体的通信调度算法如下所示:算法 2.当 时( 算法 2 中的符号请参见表),c(/()n,(gcd qppq1 和定理 1 中的参数说明).输入:()例的 COM表 real A(0:181),B(0:119)!proce
38、ssor P(0:8)!processor Q(0:2)!distribute A( cyclic(4) )onto P!distribute B( cyclic(5) )onto QFORALL (i =0:59) sA3*i +4=B2*i +1;s()例2()例的 CS 表 图 6 例及其相应的 COM 表和 CS 表101) COM 表.2) 数组分布模式和循环变量.输出:1) CS 表.步骤 1:初始化阶段(1) 消去 COM 表中全零的行和列.(2) 将 COM 表中所有的子矩阵 C ( )分成 f = /lcm(s,t)个j,i 1tj0,st*s组,即 D ( ).每个组 D
39、有 lcm(s,t)个相同的子矩阵。然后将每个组 D 内的h1f0h h消息大小按降序排列,即 .1e10m(3) 按照 m ( )的大小将 D 按降序排列,即 .h0fh 1f10(4) 为了不失普遍性,将 D 内的 lcm(s,t)个子矩阵按定理 1 中的 k 进行排序.各步按正序h和逆序交替遍历 D 中的子矩阵 C .j,i步骤 2:生成 CS 表,使得 CS 表内每一列是接收处理号的枚举 ,并且相似大小的消息尽可能地放入一个通信步内.while(COM 中所有的元素被标记 )nstep=1; /*nstep 为步数*/for(h=0;h ;/*注意,在这里允许一个发送处理器在一个通信步
40、中连续发送多个消息,以确保每个大步内各个处理器所发消息总大小相近.也就是说,如果每个大步内各个处理器发送消息的长度不相等,则将相邻的两个大步用“同步”隔开.*/标记 COMuv=,并消去该元素和该元素所在的行和列 ;如果当前 CS 的第 nstep 列的各消息大小已经对齐 ,则 break;11恢复消去的元素,被标记的元素不再参与下次计算.nstep+;通过求例的 CS 表来对算法进行说明.例的循环与通信表分别如图 7(a)和图 7(b)所示.A 以 cyclic(3)分布到 6 个处理器上,B 以 cyclic(2)分布到另外的 6 个处理器上,即,period =9,period =108
41、,依据定理可以得到6n,2y3x,2a,1qp Aesm=9,n=4,s=2,t=3.0 1 2 3 4 50 1 2 1 2 1 21 0 0 0 0 0 02 1 2 1 2 1 23 1 2 1 2 1 24 0 0 0 0 0 05 1 2 1 2 1 2C O MQ iP j0 1 2 3 4 50 1 2 1 2 1 22 1 2 1 2 1 23 1 2 1 2 1 25 1 2 1 2 1 2C O MQ iP j1 2 3 4 5 6 0 1 5 3 2 , 4 0 2 3 0 , 4 1 5 2 3 5 3 0 , 4 1 25 0 , 2 1 5 3 4C SQ ik按算
42、法有:步骤 1: 首先消去 COM 中全为零的第 2 和 5 行,则得到图 7(c).COM 被划分成 6 个子块,即 , .进而得到 f=1,m =2,m =1,D = 1,0,10CCOM1,0cji 010, , , , , . 022步骤 2:0 1 2 3 4 50 1 2 1 2 1 22 1 2 1 2 1 23 1 2 1 2 1 25 1 2 1 2 1 2C O MP jQ iP jQ i0 1 2 3 4 50 1 X 1 2 1 22 1 2 1 X 1 23 1 2 1 2 1 X5 X 2 X 2 1 2C O M0 1 2 3 4 50 1 X 1 2 1 X2
43、1 2 X X X 23 1 2 1 X 1 X5 X X X 2 1 2C O MP jQ i0 1 2 3 4 50 1 X 1 X 1 X2 1 X X X X 23 X 2 1 X X X5 X X X 2 1 XC O MP jQ i() () (c) (d) 图 7 例及其对应的 COM 表和 CS 表real A(0:71),B(0:109)!processor P(0:5)!processor Q(0:5)!distribute A( cyclic(3) )onto P!distribute B (cyclic(2) )onto QFORALL(i =0:35) sA2*i +
44、1=B3*i +4;s()例3()例的 COM 表()消去全零行和列的 COM 表 本步迭代用到的 j,iC本步迭代被标记的元素()例的 CS 表120 1 2 3 4 50 1 X X X X X2 1 X X X X X3 X X 1 X X X5 X X X X 1 XC O MP jQ i0 1 2 3 4 50 X X X X X X2 1 X X X X X3 X X X X X X5 X X X X X XC O MQ iP j(e) (f) 如图 8(a)所示,当 nstep=1 时,首先按序列 , , , , , 执行,从中选0C21012C1出 m =2=COM01=COM
45、23=COM35进行标记.然后选择 =1=COM50= 0COM52进行标记.在该步最后得到 CS1=,.当 nstep=2 时,按逆列, , , , , 执行,得到 CS2=,.依次类推,可以得1C201021C0到:当 nstep=3 时,CS3=,;当 nstep=4 时 ,CS4=,;当 nstep=5 时,CS5=,即为图 8( d)所示.从上述证明以及算法的分析,可看出算法 1 和算法 2 使调度表的每一列变成接收处理器号的枚举,即避免了处理器间的通信冲突,最小化了调度表的生成时间和实际通信的总时间.4 测试结果与分析所有的测试都是基于一个 20 节点的 SMP-Cluster,每节点配置两个 Intel Xeon 3.0GHZ/1024K L2 Cache,2GB 内存,结点通过一个 24 口千兆以太网交换机互联.安装操作系统 Redhat Linux 9.0,内核版本为 2.4.21-smp,串行编译器为 gcc 3.