收集MPI_SCAN的结果

时间:2012-05-29 14:27:07

标签: mpi openmpi prefix-sum

我有这个阵列[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]

有人可以帮我吗?

1 个答案:

答案 0 :(得分:4)

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

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(添加 6之前的任务1 中的扫描中的最后一个元素)添加到下一次扫描中的所有元素,依此类推。< / p>

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

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

也许你可以找到一些聪明的方法来使用MPI操作。