【问题标题】:Gathering results of MPI_SCAN收集 MPI_SCAN 的结果
【发布时间】:2012-06-03 19:04:53
【问题描述】:

我有这个数组 [1 2 3 4 5 6 7 8 9],我正在对其执行扫描操作。

我有 3 个 mpi 任务,每个任务获得 3 个元素,然后每个任务计算其扫描并将结果返回给主任务

task 0 - [1 2 3] => [1 3 6] 
task 1 - [4 5 6 ] => [4 9 15] 
task 2 - [7 8 9] => [7 15 24]

现在任务 0 得到所有结果 [1 3 6] [4 9 15] [7 15 24]

如何结合这些结果来产生最终的扫描输出?

数组的最终扫描输出为 [1 3 6 10 15 21 28 36 45]

谁能帮帮我?

【问题讨论】:

    标签: mpi openmpi prefix-sum


    【解决方案1】:

    您是否尝试实现自己的扫描操作?因为这不是MPI_SCAN 所做的。它对存储在每个节点上的输入数组的每个 i 元素逐元素应用扫描操作,结果将更像:

    rank 0 - [1 2 3] => [ 1  2  3]
    rank 1 - [4 5 6] => [ 5  7  9]
    rank 2 - [7 8 9] => [12 15 18]
    

    不过,为了获得您想要的结果,您应该将6(任务 0 中第一次扫描的最后一个元素)添加到下一次扫描的所有元素中:

    [ 1  3  6][ 4  9 15][ 7 15 24]
               +6 -------------->
                =
    [ 1  3  6][10 15 21][13 21 30]
    

    然后您应该将15(任务1 中扫描的最后一个元素之前 6 添加)到下一次扫描中的所有元素等等。

    [ 1  3  6][10 15 21][13 21 30]
                        +15 ---->
                        =
    [ 1  3  6][10 15 21][28 36 45]
    

    或者,您可以只将6 添加到第二次扫描的结果中,然后将21 添加到第三次扫描的结果中,依此类推。

    也许您可以找到一些使用 MPI 操作的巧妙方法。

    【讨论】:

    • +1;可以通过在数组的最后一个元素上使用 MPI_Scan 来实现上述操作(例如,获取 6 和 15),然后按上述方式进行操作,但如果所有内容都将被发送到处理器 0,这会更好这样做的方法,因为没有额外的通信开销。
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 2015-06-18
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多