首页 > 代码库 > MPI程序的任务分解方法

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的情况,下图可以看出两种分块方式的差别:


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