码迷,mamicode.com
首页 > 其他好文 > 详细

MPI程序的任务分解方法

时间:2014-05-01 21:52:30      阅读:434      评论:0      收藏:0      [点我收藏+]

标签:mpi任务分解   交叉分解   按块分解   

MPI编写并行程序时,任务分解是很重要的一部分,如何把T个任务(T块数据,T行矩阵等)分给P个进程,实现负载均衡,是需要好好考量的问题。分解任务时需要解决两个问题:

1.给出一个进程p,如何得知要处理的任务是哪些

2.给出一个任务t,如何得知它是由哪个进程处理的

(这里的pt都是从0开始计数。)

一个好的任务分配,应该能够保证这两种计算都能高效完成。下面讨论三种分配方式。这里只讨论T>P的情况,T<=P时的分解方式是显而易见的。

一,交叉分解

对于进程p,它所处里的任务号为t=p+kP,其中k要保证p+kP<=T

对于任务t,处理它的进程为p=t%P

二,按块分解

按块分解的方法是给每个进程p分配连续的任务,每个进程分配到连续的┌T/P┐或者└T/P ┘个任务。有两种分法。

方法一:

r=T%P,给前r个进程分配┌T/P┐个任务,后P-r个进程分配个└T/P ┘任务。

则对于进程p,它所处里的第一个任务号为p└T/P ┘+min(p, r),它处理的最后一个任务号为下一个进程处理的第一个任务的前一个,也即是(p+1)└T/P ┘+min(p+1, r)-1

对于任务t,处理它的进程为p=max(└t/(└ T/P┘+1)┘,└(t-r)/└ T/P┘┘),看起来的确有点麻烦,计算起来也比较费劲,因此就引出了另一种按块划分的方法。

方法二:

这种划分方法并不是把较大的块分给前面的进程,而是将这些块“随机”的分给进程。

则对于进程p,它所处里的第一个任务号为pT/P┘,它处理的最后一个任务号为下一个进程处理的第一个任务的前一个,也即是(p+1)T/P┘-1

对于任务t,处理它的进程为p=└(P(t+1)-1)/T┘

对于T=14P=4的情况,下图可以看出两种分块方式的差别:

mamicode.com,码迷

参考书籍:《MPIOpenMP并行程序设计(C语言版)》

MPI程序的任务分解方法,码迷,mamicode.com

MPI程序的任务分解方法

标签:mpi任务分解   交叉分解   按块分解   

原文地址:http://blog.csdn.net/u014495327/article/details/24812089

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!