只是一个问题。如果我使用函数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的内部或外部?提前谢谢。
答案 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 )