2012-05-29 51 views
1

我有这个数组[1 2 3 4 5 6 7 8 9],我正在执行扫描操作。收集MPI_SCAN的结果

我有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

您是否试图实施自己的扫描操作?由于这不是MPI_SCAN所做的。它适用在扫描操作的elementwise对存储在每个节点上的输入阵列的每个个元件,结果会更喜欢:

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

尽管如此,为了获得想要,则结果应(从第一次扫描中任务0的最后一个元素)添加6所有元素在接下来的扫描:

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

那么你应该在任务1 扫描添加15(最后一个元素前被添加)到下一次扫描中的所有元素等等。

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

另外,您可以添加6只能从第二扫描结果,然后从第三扫描添加21的结果等等。

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

+0

+1;我们可以通过在数组的最后一个元素上使用MPI_Scan(例如,获取6和15)来实现上述过程,然后如上所述继续,但是如果所有内容都将被发送到处理器0,那么这是一个更好的方法这样做的方式,因为没有额外的通信开销。 –