首页 > 代码库 > MPI程序的任务分解方法
MPI程序的任务分解方法
用MPI编写并行程序时,任务分解是很重要的一部分,如何把T个任务(T块数据,T行矩阵等)分给P个进程,实现负载均衡,是需要好好考量的问题。分解任务时需要解决两个问题:
1.给出一个进程p,如何得知要处理的任务是哪些
2.给出一个任务t,如何得知它是由哪个进程处理的
(这里的p和t都是从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=14,P=4的情况,下图可以看出两种分块方式的差别:
参考书籍:《MPI与OpenMP并行程序设计(C语言版)》