在MPI中,缩小和扫描有何不同?

dan*_*007 2 mpi

我在教自己MPI.我正在阅读有关reduce和scan的Python文档:http: //documen.tician.de/boostmpi/reference.html#boostmpi.scan

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

减少和扫描有何不同?

tpg*_*114 8

减少意味着所有处理器获得相同的值,而扫描返回每个处理器上的部分操作结果.例如,如果你有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_Scan则:

[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
Run Code Online (Sandbox Code Playgroud)

扫描结果来自 [0, 0+1, 0+1+2, 0+1+2+3, ..., 0+1+2+3+4+5+6+7+8+9]

在Python中,结果列表MPI_Reduce将是(假设处理器0是根):

[45, None, None, None, None, None, None, None, None, None]
Run Code Online (Sandbox Code Playgroud)

而在其他语言中recvbuf,除根之外的所有处理器中都会有未定义的数据.