别求和 , 最后对所有处理器计算出 来的“ 部分和 ” 进行求和 。 从上面我们找到了问题的并行成分 , 接下来就 要考虑这些任务以何种方式分配给各个处理器 , 这 里不讨论一些特殊情况 , 如该数组的行数小于处理 器的个数的情况 ,因为这种情况也许在一个处理器 的机器上利用串行程序更能取得更好的效率 。 我们可以先计算出每个处理器至少分配到的行 数 : AverageL ineNum ber = A rraySize [ 0 ] / size, 如果 处理器个数不能整除行数 , 这样将有 HeavyProces2 sorNum ber = A rraySize [ 0 ] mod size 个处理器分得 AverageL ineNum ber + 1 行 , 其中 , A rraySize [ 0 ]为该 数组的行数 , size 为所有处理器的个数 。我们规定 编号小的处理器分得更多的行 , 这样就可以得到编 号为 rank 的处理器分得的行数 : M ylineNumber = AverageL ineNum ber + 1 rank < HeavyProcessorNumber AverageL ineNum ber rank ≥HeavyProcessor Number 至此 ,就可以分配任务了 。 接下来 ,
根据 M P I通信函数对传递信息组织的 特点 ,不宜直接给出二维数组的首地址和长度 ,所以 可以通过先把要传递的元素存入一个一维数组中来 发送 。 ( 3 )算法描述 输入 : 二维数组 Data的行数 row s和列数 cols 输出 : 数组中所有元素之和 。 ① 如果当前处理器是 0 号时 , 接收从键盘中输
入的数组的行数和列数 。同时随机产生数组的所有 元素 ; ② 将矩阵的尺寸广播给其它处理器 ; ③ 计算每个处理器所分配数组的行数 ; ④ 如果是 0 号处理器 , 将根据各个处理器所应 分配的行数 ,将数据元素发送给其它处理器 。否则 , 接收相应的数组元素 ; ⑤0 号处理器收集各处理器上的“ 部分和 ” ; ⑥0 号处理器对所有的“ 部分和 ” 求和 , 并将结 果输出 。 ( 4 )程序实现 #include "mp i h" . #include < iostream > using namespace std; void main ( int argc, char 3 argv[ ] )
{ int rank, size; M P I: : Status Status; M P I: : Init ( argc, argv) ; / /初始化 M P I环境 rank =M P I: : COMM _WORLD. Get_rank ( ) ; size =M P I: : COMM _WORLD. Get_size ( ) ; / /定义与数组有关的数据结构 const int MAXX = 8,MAXY = 4; int Data [MAXX ] [MAXY ]; int A rraySize [ 2 ]; if ( rank = = 0 ) const int MAXPROCESSOR = 64; { / /接收二维矩阵的行 、 列数 ,并利用随机函数生
成元素的值 …… } / /广播矩阵的尺寸 M P I: : COMM _ WORLD. Bcast ( A rraySize, 2, M P I: : I T, 0 ) ; N / /定义与任务分配有关的数据结构 int AverageL ineNumber, HeavyProcessorNum ber, M yL ineNumber; int CurrentL ine, StartL ine, SendSize; int SendA rray[MAXX 3 MAXY ]; / /计算每个处理其应分得的矩阵行数 AverageL ineNumber =A rraySize [ 0 ] / size; HeavyProcessorNumber =A rraySize [ 0 ] % size; if ( rank < HeavyProcessor Number)
M yL ineNum ber =AverageL ineNumber + 1;
1 期 第 许淳 ,刘兴平 ,等 : 基于 VC. NET平台和 M P I并行程序设计探索
17
else M yL ineNum ber =AverageL ineNum ber; / /如果是号处理器 ,进行任务分配 if ( rank = = 0 ) { CurrentL ine =A rraySize [ 0 ]; for ( int i = size - 1; i > = 0; i - - ) { SendSize = 0; if ( i < HeavyProcessorNumber) Start ine = CurrentL ine - AverageL ineNumber; L else StartL ine = CurrentL ine - AverageL ineNumber + 1; for ( int j = StartL ine; j < = CurrentL ine; j + + ) for ( int k = 1; k < =A rraySize [ 1 ]; k + + ) SendA rray[ SendSize + + ] =Data [ j ] [ k ]; if ( i! = 0 ) M P I: : COMM _WORLD. Send ( SendA rray, Send2 Size,M P I: : I T, i, 10 ) ; N CurrentL ine = StartL ine - 1; } } / /非 0 号处理其接收分配的矩阵 else M P I: : COMM _WORLD. Recv ( SendA rray,M yL in2 eNumber3 A rraySize [ 1 ] ,M P I: : I T, 0, 10, Status) ; N / /定义每个处理器的“ 部分和 ” 变量 int 3 Sum = new ( int) ;
/ /每个处理器 ,完成自己的计算任务 参考文献
Abstract: It is briefly in
troduced that the installing on the w indow s XP aboutM P ICH2 and its configuration in VC. paper by i p lem enting the sum of the elements of a two dim ensional array m . Key
words:mp i; mp ich