在MPI中,reduce和scan有何不同?

在MPI中,reduce和scan有何不同?,mpi,Mpi,我在自学MPI。我正在阅读关于reduce和scan的Python文档: reduce和scan似乎都使用了一些函数(op),并使用它将从各个进程获得的值减少为单个值 reduce和scan有何不同?reduce意味着所有处理器获得相同的值,而scan返回每个处理器上的部分操作结果。例如,如果您有10个处理器,并且您要计算它们的秩和,MPI_Reduce将仅给出根进程上的标量45(0+1+2+3+4+5+6+7+8+9),而MPI_scan将给出每个处理器上的处理器秩的缩减标量。处理器0将得到

我在自学MPI。我正在阅读关于reduce和scan的Python文档:

reduce和scan似乎都使用了一些函数(op),并使用它将从各个进程获得的值减少为单个值


reduce和scan有何不同?

reduce意味着所有处理器获得相同的值,而scan返回每个处理器上的部分操作结果。例如,如果您有10个处理器,并且您要计算它们的秩和,
MPI_Reduce
将仅给出根进程上的标量45(0+1+2+3+4+5+6+7+8+9),而
MPI_scan
将给出每个处理器上的处理器秩的缩减标量。处理器0将得到0,处理器1将得到1,处理器2将得到3,依此类推。处理器9将得到45

换句话说,如果您要列出从MPI_扫描中找到的所有处理器值,它将是:

[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
扫描结果来自
[0,0+1,0+1+2,0+1+2+3,…,0+1+2+3+4+5+6+7+8+9]

在Python中,
MPI\u Reduce
的结果列表将是(假设处理器0是根):


而其他语言的
recvbuf
在除root之外的所有处理器上都会有未定义的数据。

谢谢,但是不是所有的reduces和scans都有一个root进程吗?根进程接收到的结果(45)到底不一样吗?我刚刚更正了答案。扫描没有根进程,所有处理器都会获得一些数据(部分缩减)。Reduce只将答案放在根处理器上。最初的答案是考虑MPI\u Allreduce,它将在每个处理器上放置45个。啊,这是有道理的!非常感谢。
[45, None, None, None, None, None, None, None, None, None]