17.2.382. MPI_Type_create_darray

MPI_Type_create_darray — 创建一个分布式数组数据类型;

17.2.382.1. 语法

17.2.382.1.1. C语法

#include <mpi.h>

int MPI_Type_create_darray(int size, int rank, int ndims,
     const int array_of_gsizes[], const int array_of_distribs[],
     const int array_of_dargs[], const int array_of_psizes[],
     int order, MPI_Datatype oldtype, MPI_Datatype *newtype)

17.2.382.1.2. Fortran语法

USE MPI
! or the older form: INCLUDE 'mpif.h'
MPI_TYPE_CREATE_DARRAY(SIZE, RANK, NDIMS, ARRAY_OF_GSIZES,
     ARRAY_OF_DISTRIBS, ARRAY_OF_DARGS, ARRAY_OF_PSIZES, ORDER,
     OLDTYPE, NEWTYPE, IERROR)

     INTEGER SIZE, RANK, NDIMS, ARRAY_OF_GSIZES(*), ARRAY_OF_DISTRIBS(*),
             ARRAY_OF_DARGS(*), ARRAY_OF_PSIZES(*), ORDER, OLDTYPE,
             NEWTYPE, IERROR

17.2.382.1.3. Fortran 2008 语法

USE mpi_f08
MPI_Type_create_darray(size, rank, ndims, array_of_gsizes,
     array_of_distribs, array_of_dargs, array_of_psizes, order,
             oldtype, newtype, ierror)
     INTEGER, INTENT(IN) :: size, rank, ndims, array_of_gsizes(ndims),
     array_of_distribs(ndims), array_of_dargs(ndims),
     array_of_psizes(ndims), order
     TYPE(MPI_Datatype), INTENT(IN) :: oldtype
     TYPE(MPI_Datatype), INTENT(OUT) :: newtype
     INTEGER, OPTIONAL, INTENT(OUT) :: ierror

17.2.382.2. 输入参数

  • size: 进程组的大小(正整数)。

  • rank: 进程组中的排名(非负整数)。

  • ndims: 数组维数以及进程网格维数(正整数)。

  • array_of_gsizes: 全局数组每个维度中oldtype类型的元素数量(正整数数组)。

  • array_of_distribs: 数组在每个维度上的分布(状态数组)。

  • array_of_dargs: 每个维度中的分布参数(正整数数组)。

  • array_of_psizes: 进程网格在每个维度上的大小(正整数数组)。

  • order: 数组存储顺序标志(状态)。

  • oldtype: 旧数据类型(句柄)。

17.2.382.3. 输出参数

  • newtype: 新数据类型(句柄)。

  • ierror: 仅限Fortran:错误状态(整数)。

17.2.382.4. 描述

MPI_Type_create_darray 可用于生成与将oldtype元素的ndims维数组分布到逻辑进程的ndims维网格上相对应的数据类型。array_of_psizes中未使用的维度应设置为1。要使MPI_Type_create_darray调用正确,需满足以下等式

  ndims-1
pi              array_of_psizes[i] = size
  i=0

必须满足。进程网格中的进程顺序假定为行优先,类似于MPI标准中虚拟笛卡尔进程拓扑的情况。

数组的每个维度可以通过以下三种方式之一进行分布:

  • MPI_DISTRIBUTE_BLOCK - 块分布

  • MPI_DISTRIBUTE_CYCLIC - 循环分布

  • MPI_DISTRIBUTE_NONE - 该维度未进行分布式处理。

常量MPI_DISTRIBUTE_DFLT_DARG用于指定默认的分布参数。对于未进行分布的维度,其分布参数将被忽略。在任何维度i中,若分布方式为MPI_DISTRIBUTE_BLOCK,则指定array_of_dargs[i]*array_of_psizes[i] < array_of_gsizes[i]将导致错误。

例如,HPF布局ARRAY(CYCLIC(15))对应MPI_DISTRIBUTE_CYCLIC且分布参数为15,而HPF布局ARRAY(BLOCK)则对应MPI_DISTRIBUTE_BLOCK且分布参数为MPI_DISTRIBUTE_DFLT_DARG。

order参数与MPI_Type_create_subarray中的用法相同,用于指定存储顺序。因此,通过此类型构造器描述的数组可以按Fortran(列优先)或C(行优先)顺序存储。order的有效值为MPI_ORDER_FORTRAN和MPI_ORDER_C。

该例程创建一个新的MPI数据类型,其类型映射通过名为"cyclic()"的函数定义(见下文)。

不失一般性,只需为未使用MPI_DISTRIBUTE_DFLT_DARG的MPI_DISTRIBUTE_CYCLIC情况定义类型映射即可。

对于维度i,MPI_DISTRIBUTE_BLOCK和MPI_DISTRIBUTE_NONE可以简化为MPI_DISTRIBUTE_CYCLIC的情况,具体如下。

array_of_dargs[i]等于MPI_DISTRIBUTE_DFLT_DARG时,MPI_DISTRIBUTE_BLOCK等同于将array_of_dargs[i]设置为MPI_DISTRIBUTE_CYCLIC的情况

(array_of_gsizes[i] + array_of_psizes[i] - 1)/array_of_psizes[i]

如果array_of_dargs[i]不是MPI_DISTRIBUTE_DFLT_DARG,那么MPI_DISTRIBUTE_BLOCK和DISTRIBUTE_CYCLIC是等效的。

MPI_DISTRIBUTE_NONE 等同于将 array_of_dargs[i] 设置为 array_of_gsizes[i] 的 MPI_DISTRIBUTE_CYCLIC。

最后,当array_of_dargs[i]等于MPI_DISTRIBUTE_DFLT_DARG时,MPI_DISTRIBUTE_CYCLIC等同于将array_of_dargs[i]设置为1的MPI_DISTRIBUTE_CYCLIC。

17.2.382.5. 注意事项

对于Fortran和C语言数组,进程网格中的进程顺序默认为行优先排列。这与MPI中虚拟笛卡尔进程拓扑所使用的排序方式一致。要创建此类虚拟进程拓扑,或查找进程在网格中的坐标等,用户可以使用MPI提供的相应函数。

17.2.382.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手册页获取完整的MPI错误代码列表。

有关更多信息,请参阅MPI-3.1标准中的错误处理部分。