1

我有这个数组 [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]

谁能帮帮我?

4

1 回答 1

4

您是否尝试实现自己的扫描操作?因为这不是什么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 操作找到一些巧妙的方法来做到这一点。

于 2012-05-29T17:53:30.003 回答