17.2.85. MPI_Dist_graph_create_adjacent
MPI_Dist_graph_create_adjacent — 创建一个附加了拓扑信息的新通信器。
17.2.85.1. 语法
17.2.85.1.1. C语法
#include <mpi.h>
int MPI_Dist_graph_create_adjacent(MPI_Comm comm_old, int indegree, const int sources[],
const int sourceweights[], int outdegree, const int destinations[], const int destweights[],
MPI_Info info, int reorder, MPI_Comm *comm_dist_graph)
17.2.85.1.2. Fortran语法
USE MPI
! or the older form: INCLUDE 'mpif.h'
MPI_DIST_GRAPH_CREATE_ADJACENT(COMM_OLD, INDEGREE, SOURCES, SOURCEWEIGHTS, OUTDEGREE,
DESTINATIONS, DESTWEIGHTS, INFO, REORDER, COMM_DIST_GRAPH, IERROR)
INTEGER COMM_OLD, INDEGREE, SOURCES(*), SOURCEWEIGHTS(*), OUTDEGREE, DESTINATIONS(*), DESTWEIGHTS(*), INFO
INTEGER COMM_DIST_GRAPH, IERROR
LOGICAL REORDER
17.2.85.1.3. Fortran 2008 语法
USE mpi_f08
MPI_Dist_Graph_create_adjacent(comm_old, ndegree, sources, sourceweights,
outdegree, destinations, destweights, info, reorder,
comm_dist_graph, ierror)
TYPE(MPI_Comm), INTENT(IN) :: comm_old
INTEGER, INTENT(IN) :: indegree, sources(indegree), outdegree, destinations(outdegree)
INTEGER, INTENT(IN) :: sourceweights(*), destweights(*)
TYPE(MPI_Info), INTENT(IN) :: info
LOGICAL, INTENT(IN) :: reorder
TYPE(MPI_Comm), INTENT(OUT) :: comm_dist_graph
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
17.2.85.2. 输入参数
comm_old: 输入无拓扑结构的通信器(句柄)。indegree: sources 和 sourceweights 数组的大小(非负整数)。sources: 调用进程作为目标进程的源进程排名(非负整数数组)。sourceweights: 调用进程的输入边权重(非负整数数组)。outdegree: destinations 和 destweights 数组的大小(非负整数)。destinations: 调用进程作为源进程的目标进程的等级(非负整数数组)。destweights: 调用进程的出边权重(非负整数数组)。info: 关于权重优化和解释的提示(handle)。reorder: 排名可以重新排序(true)或保持不变(false)(逻辑值)。
17.2.85.3. 输出参数
comm_dist_graph: 添加了分布式图拓扑的通信器(句柄)。ierror: 仅限Fortran:错误状态(整数)。
17.2.85.4. 描述
MPI_Dist_graph_create_adjacent 创建一个具有分布式图拓扑结构的新通信器 comm_dist_graph,并返回该新通信器的句柄。comm_dist_graph 中的进程数量与 comm_old 中的进程数量相同。每个进程传递其在虚拟分布式图拓扑中所有入边和出边的信息。调用进程必须确保图中的每条边在源进程和目标进程中以相同的权重进行描述。如果给定的(源,目标)对存在多条边,则这些边的权重顺序无关紧要。完整的通信拓扑是 comm_old 中所有进程的 sources 数组所显示的所有边的组合,必须与 destinations 数组所显示的所有边的组合相同。源和目标排名必须是 comm_old 的进程排名。这允许对通信图进行完全分布式的描述。允许存在孤立进程(即没有出边或入边的进程,这些进程的入度和出度指定为零,因此在图描述中不会作为源或目标排名出现)。对 MPI_Dist_graph_create_adjacent 的调用是集体操作。
17.2.85.5. 权重
权重被指定为非负整数,可用于影响进程重映射策略和其他内部MPI优化。例如,后续沿特定边的通信调用的近似计数参数可用作边的权重。边的多重性同样可以表示进程对之间更密集的通信。然而,边权重的确切含义并未由MPI标准规定,而是留给具体实现决定。应用程序可以为权重数组提供特殊值MPI_UNWEIGHTED,表示所有边具有相同的(实际上无)权重。若仅为comm_old的部分进程而非全部提供MPI_UNWEIGHTED,则属于错误操作。如果图是加权的但入度或出度为零,则可分别向sourceweights或destweights传递MPI_WEIGHTS_EMPTY或任意数组。请注意MPI_UNWEIGHTED和MPI_WEIGHTS_EMPTY并非特殊的权重值,而是整个数组参数的特殊值。在Fortran中,MPI_UNWEIGHTED和MPI_WEIGHTS_EMPTY是类似MPI_BOTTOM的对象(不可用于初始化或赋值)。参见MPI-3第2.5.4节。
17.2.85.6. 错误
几乎所有MPI例程都会返回一个错误值;C语言例程通过函数返回值返回,Fortran例程则通过最后一个参数返回。
在返回错误值之前,会调用与通信对象(如通信器、窗口、文件)关联的当前MPI错误处理程序。如果MPI调用未关联任何通信对象,则该调用被视为附加到MPI_COMM_SELF,并将调用关联的MPI错误处理程序。当MPI_COMM_SELF未初始化时(即在MPI_Init/MPI_Init_thread之前、MPI_Finalize之后,或仅使用会话模型时),错误会触发初始错误处理程序。初始错误处理程序可通过在使用世界模型时调用MPI_Comm_set_errhandler来修改MPI_COMM_SELF,或通过mpiexec的mpi_initial_errhandler命令行参数,或MPI_Comm_spawn/MPI_Comm_spawn_multiple的info键来设置。如果未设置其他适当的错误处理程序,则MPI I/O函数将调用MPI_ERRORS_RETURN错误处理程序,而其他所有MPI函数将调用MPI_ERRORS_ABORT错误处理程序。
Open MPI 包含三个可使用的预定义错误处理器:
MPI_ERRORS_ARE_FATAL导致程序中止所有连接的MPI进程。MPI_ERRORS_ABORT一个可在通信器、窗口、文件或会话上调用的错误处理程序。当在通信器上调用时,其行为类似于在该通信器上调用MPI_Abort。如果在窗口或文件上调用,则行为类似于在包含对应窗口或文件中进程组的通信器上调用MPI_Abort。如果在会话上调用,则仅中止本地进程。MPI_ERRORS_RETURN向应用程序返回一个错误代码。
MPI应用程序也可以通过调用以下方式实现自己的错误处理程序:
请注意,MPI不保证MPI程序在出现错误后能够继续运行。
有关更多信息,请参阅MPI-3.1标准中的错误处理部分。