MPI树形通信结构和蝶形通信结构的实现
GitHub:https://github.com/zhangjt33/parallel-relevant-program/tree/master/MPI/group%20communication%20implementation
1. 博客内容
编写MPI程序,分别采用树形和蝶形通信结构计算全局总和。首先计算通信域comm_sz的进程数是2的幂的特殊情况,若能够正确运行,改变该程序使其适用于comm_sz中任意进程数目的值。
2. 树形通信结构
2.1 树形通信结构分析
树形通信结构是用于MPI集合通信中的一种实现结构。树形方式也有多种(如图所示),其基本思想都是将一个进程和另一个进程配对,由一个进程向另一个进程发送消息,然后发送消息的进程进入不活跃状态,接收消息的进程对收到的数据消息和自己已有的消息进行操作,之后再把消息发送给配对的进程,这个过程一直进行直到只有一个活跃的进程,这个进程的数据就是要求的全局的数据,如和,最大值,最小值等。在树形通信结构中,每一轮通信都会减少一半进程数。每个进程可能接收多次消息,但是只会发生一次消息。通信的轮次为: O ( l o g N ) O(logN) O(logN)次,其中N是进程的数量。
当一个进程获得了全局的结果后,需要分发到每一个进程,过程和求全局结果相反。通信的轮次也为: O ( l o g N ) O(logN) O(logN)次,其中N是进程的数量。分发的结构和求全局结果的结构上下对称,箭头相反。
树形通信结构1:
树形通信结构2:
2.2 进程数目为2的幂次的树形通信结构实现
2.2.1 实现分析
不同的树形通信结构方式有不同的配对策略,他们可能因此有不同的性能。我实现的是上图的第二种树形通信结构。
实现树形通信结构的关键在于确定进程的角色和与之配对的进程,在不同的时刻相互匹配的进程是不同的。
但是我们可以观察到,求全局和的过程中,每一轮的通信中,总是有一半的活跃进程发送消息,另一半的活跃进程接收消息,并且活跃的进程数量每一轮次减少一半。我们可以因此得出进程的配对伙伴:
- 当进程处在当前活跃进程的前半部分: m y _ r a n k < c u r r e n t _ c o m m _ s i z e / 2 my\_rank < current\_comm\_size/2 my_rank<current_comm_size/2时,它是接收进程,配对进程是: m y _ r a n k + c u r r e n t _ s t e p _ s i z e / 2 my\_rank + current\_step\_size/2 my_rank+current_step_size/2;
- 当进程处于当前活跃进程的后半部分: m y _ r a n k > = c u r r e n t _ c o m m _ s i z e / 2 my\_rank >= current\_comm\_size/2 my_rank>=current_comm_size/2,它是发送进程,配对进程是: m y _ r a n k − c u r r e n t _ s t e p _ s i z e / 2 my\_rank - current\_step\_size/2 my_rank−current_step_size/2;
分发全局和的过程中,每一轮的通信中,同样总是有一半的活跃进程发送消息,另一半的活跃进程接收消息,并且活跃的进程数量每一轮次增加一倍。我们可以因此得出进程的配对伙伴:
- 当进程处在当前活跃进程的前半部分时,它是发送进程,并且配对进程是: m y _ r a n k + c u r r e n t _ s t e p _ s i z e / 2 my\_ra