第四章 集合通信

4.1 概述

BACKWARDFORWARD


集合通信是一组进程间的通信.在MPI中这类函数包括:

组内的所有进程(被称作为通信例程)带着相匹配的参数去执行集合操作,其中句法和语义与点对点操作中的句法和语义保持一致.这样在发送进程和接收进程之间就可以处理一般类型的数据,但它们的类型要相互匹配,就如第三章中描述的那样.这里有一个关键的参数是通信子,它定义了参与集合操作的进程组并提供操作的上下文.有几种集合操作例程如广播和收集仅有一个原始的操作进程或接收进程,这样的进程称之为根.在集合操作函数中有些参数仅对于根来说是非常重要的,而除根以外的其他进程都不去关心它.读者可以参考第三章中有关通信消息缓冲区,普通的数据类型和类型匹配原则等有关信息;还可以从第五章中获得如何定义组和生成通信子的信息.

图4.1:一组6个进程间的集合移动函数.各图中,每一行代表每个进程中的数据位置.这样,在广播通信中,最初第一个进程包含数据A0,当通信完成后每个进程都有了这个数据

在集合操作中发送方和接收方之间的类型匹配条件比起点对点通信来说更加严格.也就是说,在集合操作中,发送方发送的数据个数必须与接收方中所描述的接收的数据个数严格匹配,但仍然允许发送方和接收方之间的不同数据类型映射(内存分布图见3.12节).

当集合通信操作一旦完成后,集合例程调用就可以立即返回(但不要求如此) 这个操作的结束表明调用者现在可以自由地访问通信消息缓冲区,而并不表明组内其他成员已经完成了这些操作或已经开始此操作(除非在操作中特殊指定).所以一个集合通信调用可以对也可以不对所有调用此操作的进程产生一个同步的效果.当然,栅障函数不包括在内.

集合通信调用可以和点对点通信共用一个通信子,MPI保证由集合通信调用产生的消息不会和点对点调用产生的消息相混淆.有关于正确使用集合操作例程的更详细的描述请见4.12节.

原则:在MPI中制定了数据长度相等的限制(在类型匹配时),它使得在为查找发送的数据量而对MPI_RECV函数的状态参数进行模拟时所必须提供的工具不至于过于复杂.有些集合操作便通常需要一个数组来存放这些状态信息.

在集合操作中不需要通信消息标志参数.如果将来的MPI新版本定义了非阻塞的集合通信函数,也许那时标志(或类似的机制)就需要引入以防止多重操作,未决(pending)操作和集合操作间彼此之间造成的混淆.(原则结尾)

对用户的建议:为保证程序正确性而依赖于集合操作中同步的副作用是很危险的作法.例如,即便一个特定的实现策略可以提供一个带有同步副作用的广播通信例程, 但标准却不支持它,因此依赖于此副作用的程序将不可移植.

从另一方面讲,一个正确的、可移植的程序必须能容忍集合操作可能带来同步这样 一个事实.尽管一个程序可以丝毫不依赖于这种同步的副作用,编程时也必须这样做.这个问题在4.12节中还将进一步讨论(对用户的建议结尾)

对实现者的建议:当厂家为他们的特定结构机器编制集合操作例程时,一个完整的集合通信例程库可以完全用MPI中点对点的通信函数和少数几个函数来书写.如果这些是在点对点通信的基础上实现的,那么为了避免集合例程调用时集合通信操作和点对点通信相互之间产生干扰,就必须生成一个隐含的、特殊的通信子.这些将在4.12节中进一步讨论.(对实现者的建议结尾)


Copyright: NPACT BACKWARDFORWARD