天天看点

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程序的任务分解方法

参考书籍:《mpi与openmp并行程序设计(c语言版)》