【问题标题】:In MPI, how do reduce and scan differ?在 MPI 中,reduce 和 scan 有何不同?
【发布时间】:2012-10-09 14:34:42
【问题描述】:

我正在自学 MPI。我正在阅读有关减少和扫描的 Python 文档: http://documen.tician.de/boostmpi/reference.html#boostmpi.scan

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

reduce 和 scan 有何不同?

【问题讨论】:

    标签: mpi


    【解决方案1】:

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

    扫描结果来自[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]
    

    而其他语言 recvbuf 在除根以外的所有处理器上都包含未定义的数据。

    【讨论】:

    • 谢谢,但不是所有reduce和scans都有根进程吗?就根进程收到的内容而言,最终结果是否相同(45)?
    • 我刚刚更正了答案。 Scan 没有根进程,所有处理器都获取一些数据(部分还原)。 Reduce 只将答案放在根处理器上。最初的答案是考虑MPI_Allreduce,它将在每个处理器上放置 45。
    • 啊,有道理!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多