17.2.471. MPIX_Comm_iagree

MPIX_Comm_agree, MPIX_Comm_iagree - 在所有存活的进程中协商一个标志值,并将结果分发回所有存活的进程,即使在进程故障后也能执行。

这是用户级故障缓解ULFM扩展的一部分。

17.2.471.1. 语法

17.2.471.1.1. C语法

#include <mpi.h>
#include <mpi-ext.h>

int MPIX_Comm_agree(MPI_Comm comm, int *flag)

int MPIX_Comm_iagree(MPI_Comm comm, int *flag, MPI_Request *request)

17.2.471.1.2. Fortran语法

USE MPI
USE MPI_EXT
! or the older form: INCLUDE 'mpif.h'

MPIX_COMM_AGREE(COMM, FLAG, IERROR)
     INTEGER COMM, FLAG, IERROR

MPIX_COMM_IAGREE(COMM, FLAG, REQUEST, IERROR)
     INTEGER COMM, FLAG, REQUEST, IERROR

17.2.471.1.3. Fortran 2008 语法

USE mpi_f08
USE mpi_ext_f08

MPIX_Comm_agree(comm, flag, ierror)
     TYPE(MPI_Comm), INTENT(IN) :: comm
     INTEGER, INTENT(INOUT) :: flag
     INTEGER, OPTIONAL, INTENT(OUT) :: ierror

MPIX_COMM_IAGREE(COMM, FLAG, REQUEST, IERROR)
     TYPE(MPI_Comm), INTENT(IN) :: comm
     INTEGER, INTENT(INOUT), ASYNCHRONOUS :: flag
     TYPE(MPI_Request), INTENT(OUT) :: request
     INTEGER, OPTIONAL, INTENT(OUT) :: ierror

17.2.471.2. 输入参数

  • comm: 通信器(句柄)。

  • flag: 二进制标志位(整数)。

17.2.471.3. 输出参数

  • flag: 精简的二进制标志(整数)。

  • request: 请求(句柄,仅限非阻塞模式)。

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

17.2.471.4. 描述

该集体通信就整数值flag达成一致,并(隐式地)就comm中故障进程的组别达成共识。

完成后,所有未失败的MPI进程已达成一致,将flag的输出整数值设置为对输入的flag值进行按位与操作的结果。

MPIX_Comm_iagreeMPIX_Comm_agree 的非阻塞版本。

17.2.471.5. 进程故障

当一个MPI进程在参与agree操作之前发生故障时,flag的计算将忽略其贡献,并且该操作会引发一个MPIX_ERR_PROC_FAILED类的错误。

当出现MPIX_ERR_PROC_FAILED类错误时,该错误会在comm通信组的所有MPI进程中一致地触发。

MPIX_Comm_agree引发MPIX_ERR_PROC_FAILED类错误后,后续对comm调用MPIX_Comm_get_failed所产生的组将包含所有未参与flag计算的MPI进程。

17.2.471.6. 当通信器包含已确认的故障时

如果在调用MPIX_Comm_agree(或MPIX_Comm_iagree)之前,comm通信组中所有MPI进程都已确认某个MPI进程的故障(通过MPIX_Comm_ack_failed),那么当flag输出值忽略该故障进程的贡献时,将不会引发MPIX_ERR_PROC_FAILED错误。请注意这是一个一致性属性:如果在comm中任何存活的进程上发现某个非贡献进程未被确认,所有进程都将引发MPIX_ERR_PROC_FAILED类错误。

示例1: 通过结合使用MPIX_Comm_ack_failedMPIX_Comm_agree,用户可以在comm中的所有MPI进程间传播并同步故障信息。

Comm_get_failed_consistent(MPI_Comm c, MPI_Group * g) {
    int rc; int T=1;
    int size; int num_acked;
    MPI_Group gf;
    int ranges[3] = {0, 0, 1};

    MPI_Comm_size(c, &size);

    do {
        /* this routine is not pure: calling MPI_Comm_ack_failed
         * affects the state of the communicator c */
        MPIX_Comm_ack_failed(c, size, &num_acked);
        /* we simply ignore the T value in this example */
        rc = MPIX_Comm_agree(c, &T);
    } while( rc != MPI_SUCCESS );
    /* after this loop, MPIX_Comm_agree has returned MPI_SUCCESS at
     * all processes, so all processes have Acknowledged the same set of
     * failures. Let's get that set of failures in the g group. */
    if( 0 == num_acked ) {
        *g = MPI_GROUP_EMPTY;
    }
    else {
        MPIX_Comm_get_failed(c, &gf);
        ranges[1] = num_acked - 1;
        MPI_Group_range_incl(gf, 1, ranges, g);
        MPI_Group_free(&gf);
    }
}

17.2.471.7. 当通信器被撤销时

此函数永远不会引发MPIX_ERR_REVOKED类错误。 当comm被撤销,或当comm的组包含失效的MPI进程时,MPIX_Comm_agree的既定语义仍将保持。 特别需要注意的是,MPIX_Comm_agree是一个集体操作,即使comm被撤销时也是如此。

17.2.471.8. 当通信器为跨通信器时

当通信器为跨通信器时,flag的值是对远程组贡献值进行按位与运算的结果。

当出现MPIX_ERR_PROC_FAILED类错误时,该错误会在comm通信组的所有MPI进程中一致触发,即同时发生在交互通信器的本地组和远程组中。

17.2.471.9. 错误

几乎所有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标准中的错误处理部分。