MPI_Reduce 函数

对组的所有成员执行全局归约操作。 可以指定预定义的数学或逻辑运算或应用程序定义的运算。

语法

int MPIAPI MPI_Reduce(
  _In_      void         *sendbuf,
  _Out_opt_ void         *recvbuf,
            int          count,
            MPI_Datatype datatype,
            MPI_Op       op,
            int          root,
            MPI_Comm     comm
);

参数

  • sendbuf [in]
    缓冲区的句柄,该缓冲区包含要发送到根进程的数据。

    如果 comm 参数引用内部通信器,则可以通过在所有进程中指定 MPI_IN_PLACE 来指定就地选项。 将忽略 sendcountsendtype 参数。 每个进程在相应的接收缓冲区元素中输入数据。 第 n个进程将数据发送到接收缓冲区的第 n个元素。 根进程从接收缓冲区的相应元素获取其输入数据,并将其替换为输出数据。

  • recvbuf [out, optional]
    用于接收缩减操作结果的缓冲区的句柄。 此参数仅在根进程中有效。

  • 计数
    要从此过程发送的元素数。

  • datatype
    缓冲区中每个元素的数据类型。 此参数必须与 op 参数中指定的操作兼容。

  • op
    要执行的全局缩减操作。 句柄可以指示内置或应用程序定义的操作。 有关预定义操作的列表,请参阅 MPI_Op 主题。

  • root
    指定通信器中接收进程的排名。

  • comm
    MPI_Comm通信器句柄。

返回值

返回成功 时MPI_SUCCESS 。 否则,返回值为错误代码。

在 Fortran 中,返回值存储在 IERROR 参数中。

Fortran

    MPI_REDUCE(SENDBUF, RECVBUF, COUNT, DATATYPE, OP, ROOT, COMM, IERROR) 
        <type> SENDBUF(*), RECVBUF(*) 
        INTEGER COUNT, DATATYPE, OP, ROOT, COMM, IERROR

注解

MPI_Reduce 函数的实现假设是指定的操作是关联的。 所有预定义操作都设计为关联和可交换。 用户可以定义设计为关联但不可交换的操作。 缩减操作的默认评估顺序由组中进程的排名确定。 但是,实现可以利用结合性或结合性和可交换性来更改计算顺序。 此过程可以更改非严格关联和可交换性操作(如浮点加法)的缩减结果。

某些应用程序不能忽略浮点运算的非关联性质,或者可能使用需要特殊计算顺序且不能视为关联性的用户定义的操作。 在这种情况下,可以显式强制实施计算顺序。 例如,对于需要严格从左到右或从右到左计算顺序的操作,可以使用以下过程:

  1. 例如,使用 MPI_Gather 函数收集单个进程中的所有操作数。
  2. 按所需顺序应用缩减操作,例如,使用 MPI_Reduce_local 函数。
  3. 如果需要,将结果广播或分散到其他进程。

注意

可以为每个进程中的 MPI_Reduce 函数提供不同的用户定义的操作。 在本例中, 函数不定义对哪些操作数使用哪些操作。 不能对 如何实现 MPI_Reduce 函数做出任何假设。 在每个进程中指定相同的操作是最安全的。

 

用户定义的运算符可以对一般的派生数据类型进行操作。 在这种情况下,应用化简操作的每个参数都是由此类数据类型描述的一个元素,该数据类型可以包含多个基本值。

发送缓冲区中允许重叠数据类型,但在接收缓冲区中不允许。 接收缓冲区中的重叠数据类型可能会产生不可预知的结果,并被视为错误。

如果 comm 参数引用内部通信器, 则MPI_Reduce 函数将组合组中每个进程的输入缓冲区中指定的元素,并使用指定的操作返回根进程的输出缓冲区中的组合值。

输入缓冲区和输出缓冲区具有相同数据类型的相同元素数。 通过对 countdatatypeoprootcomm 参数使用相同的值来调用所有组成员中的函数。 这种做法可确保所有进程提供具有相同类型的元素的相同长度的输入缓冲区和输出缓冲区。

每个进程可以提供一个元素或一个元素序列,在这种情况下,对序列的每个条目的每个元素执行操作。 例如,如果操作 MPI_MAX 并且发送缓冲区包含两个是浮点数的元素,则 recvbuf(1) 接收 的 (sendbuf(1)) 全局最大值,并 recvbuf(2) 接收 的 (sendbuf(2))全局最大值。

如果 comm 参数引用对讲器,则调用涉及对讲器中的所有进程,但包含一个组 A,用于定义根进程。 另一组 B 中的所有进程在参数中设置相同的值,即组 A 中根进程的排名。根进程在参数中MPI_ROOT设置值。 组 A 中的所有其他进程MPI_PROC_NULL参数中设置值。 只有发送缓冲区参数在 B 组进程中是重要的,只有接收缓冲区参数在根进程中是重要的。

要求

产品

HPC Pack 2012 MS-MPI 可再发行程序包、HPC Pack 2008 R2 MS-MPI 可再发行程序包、HPC Pack 2008 MS-MPI 可再发行程序包或 HPC Pack 2008 客户端实用工具

标头

Mpi.h;Mpif.h

Msmpi.lib

DLL

Msmpi.dll

另请参阅

MPI 集合函数

MPI_Datatype

MPI_Gather

MPI_Op

MPI_Bcast