关于MPI_Reduce

时间:2016-01-14 17:51:24

标签: c mpi

只是一个问题。如果我使用函数MPI_Reduce,只有root可以分配接收缓冲区,这是一个动态数组?例如:

int r = 10;
int *yloc, *y;
...
yloc = calloc(r*sizeof(int)); // for all processes

if (I'm the master process) {
    y = calloc(r*sizeof(int))  // inside the if-block ...
    ...
}
y = calloc(r*sizeof(int))  // ...or outside the if-block?
...
MPI_Reduce(yloc, y, r, MPI_FLOAT, MPI_SUM, ROOT, MPI_COMM_WORLD);

什么是正确的?在if-block的内部或外部?提前谢谢。

1 个答案:

答案 0 :(得分:3)

两者都是正确的。但我想你想要的答案是y是否是有效的内存地址只对MPI_Reduce()调用的根进程有用。因此,除了根目录之外,没有必要为任何其他进程分配内存。

为了完整,这里是MPI_Reduce手册页的摘录,我们可以在其中读到接收缓冲区仅对根进程有意义:

NAME
       MPI_Reduce -  Reduces values on all processes to a single value

SYNOPSIS
       int MPI_Reduce(const void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype,
                      MPI_Op op, int root, MPI_Comm comm)

INPUT PARAMETERS
       sendbuf
              - address of send buffer (choice)
       count  - number of elements in send buffer (integer)
       datatype
              - data type of elements of send buffer (handle)
       op     - reduce operation (handle)
       root   - rank of root process (integer)
       comm   - communicator (handle)

OUTPUT PARAMETERS
       recvbuf
              - address of receive buffer (choice, significant only at root )