父进程和子进程形成的组间通信域上的通信
MPI-2的动态进程的创建是指从已经存在的一个组间通信域进程组的进程,派生出若干个进程形成一个新的进程组,原来的进程组相对于新派生的进程组称为父进程组,而新派生的进程组相对于原来的进程组称为子进程组。父子进程组属于不同的通信域,它们之间的通信是通过父子进程组的通信域形成的组间通信域来进行的。
MPI_COMM_SPAWN(command,argv,maxprocs,info,
root,comm,intercomm,array_of_errcodes)
INcommand将派生进程对应的可执行程序名
INargv 传递给command的参数
INmaxprocs 请求MPI派生的进程的最大个数
INinfo 传递给运行时的信息
INroot 负责检查上述参数的进程标识号
INcomm 派生新进程的组内通信域
OUT intercomm返回的组间通信域,包括原来的进程和新创建的进程
OUTarray_of_errcodes 返回的错误代码数组
Int MPI_Comm_spawn(char * command, char ** argv, int maxprocs, MPI_Info info, int root, MPI_Comm comm, MPI_Comm * intercomm, int * array_of_errcodes)
MPI_COMM_SPAWN(COMMAND, ARGV, MAXPROCS, INFO, ROOT, COMM,
INTERCOMM, ARRAY_OF_ERRCODES, IERROR)
INTEGER INFO, MAXPROCS, ROOT, COMM, INTERCOMM ARRAY_OF_ERRCODES(*),
IERROR

MPI派生新的进程是通过调用MPI_COMM_SPAWN实现的。在MPI_COMM_SPAWN中需要指出将派生的进程对应的可执行程序的名字command,传递给可执行程序的参数argv,将要派生的进程的最大个数maxprocs,以及可能的运行时信息info。对于上述这些参数,不需要MPI每个进程都进行解释,只需提供一个解释进程的标识号ROOT即可,由ROOT进程完成对上述参数的解释并传递给其它的进程。此外,还需要指出需要和将派生出来的子进程进行通信的进程形成的组内通信域,即父进程组形成的通信域,此调用返回一个即包括原来的父进程组(组内通信域域comm),又包括新创建的子进程组(组内通信域)的组间通信域intercomm,子进程组的组间通信域没有显式出现。此调用还给出了调用的返回代码信息array_of_errcodes。
此调用存在三种类型的同步,而且必须同时满足才能够进行下面的操作。首先是父进程之间的同步,必须等到所有的父进程都执行了此调用之后才能够向下执行;然后是子进程之间的同步,即所有派生出来的子进程都执行了各自的初始化调用MPI_INIT之后,子进程才可以执行下面的操作;最后是父子进程之间的同步,必须当所有的父进程都执行了MPI_COMM_SPAWN调用,所有的派生出来的子进程都执行了MPI_INIT调用之后,父子进程才可以执行下面的操作。

MPI_COMM_GET_PARENT(parent)
OUT parent 包括子进程和父进程的组间通信域
int MPI_Comm_get_parent(MPI_Comm * parent)
MPI_COMM_GET_PARENT(PARENT, IERROR)
INTEGER PARENT, IERROR

父进程组可以通过调用派生进程调用返回的组间通信域和子进程进行通信,子进程是如何得到包括父进程在内的组间通信域的信息呢?它是通过调用MPI_COMM_GET_PARENT得到的。
MPI_COMM_GET_PARENT的使用非常简单,只需在子进程中执行此调用。就可以得到包括父进程和子进程在内的组间通信域。
当父子进程都拥有了包括所有父子进程的组间通信域,它们就可以通过使用该组间通信域进行通信。

MPI_COMM_SPAWN_MULTIPLE(count, array_of_commands, array_of_argv,
array_of_max_maxprocs,array_of_info, root, vcomm,intercomm)
INcount进程组的个数
INarray_of_commands不同的进程组对应的可执行程序
INarray_of_maxprocs每个组的最大进程数
INarray_of_info每个组传递给运行时的信息
INroot 解释上述参数的进程的标识号
INcomm 派生新进程的组内通信域
OUT intercomm由不同子进程组和父进程组形成的组间通信域
OUT array_of_errcodes不同进程组返回的错误代码
int MPI_Comm_spawn_multiple(int count, char ** array_of_commands, char ***
array_of_argv, int * array_of_maxprocs, MPI_Info * array_of_info, int root, MPI_Comm
comm, MPI_Comm * intercomm, int * array_of_errcodes)
MPI_COMM_SPAWN_MULTIPLE(COUNT, ARRAY_OF_COMMANDS,
ARRAY_OF_ARGV, ARRAY_OF_MAXPROCS, ARRAY_OF_INFO, ROOT, COMM,
INTERCOMM, ARRAY_OF_ERRCODES, IERROR)
INTEGER COUNT, ARRAY_OF_MAXPROCS(*), ARRAY_OF_INFO(*),ROOT,COMM
INTERCOMM, ARRAY_OF_ERRCODES, IERR
CHARACTER *(*) ARRAY_OF_COMMANDS(*), ARRAY_OF_ARGV(COUNT, *)

MPI_COMM_SPAWN的另一种更为通用的形式是MPI_COMM_SPAWN_MULTIPLE,可以把MPI_COMM_SPAWN看作是MPI_COMM_SPAWN_MULTIPLE的一个特例。
MPI_COMM_SPAWN_MULTIPLE可以同时创建多组不同的子进程,而不是一组。
MPI_Comm_spawn创建的子进程是同一个程序的副本,而MPI_Comm_spawn_multiple可以创建不同的子进程组,各子进程组使用不同的程序副本,所有这些子进程形成的子进程组和原来的父进程组共同形成一个组间通信域。