我有这个阵列[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]
有人可以帮我吗?
答案 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]
然后,您应该将 或者,您只能将 也许你可以找到一些聪明的方法来使用MPI操作。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
添加到第三次扫描的结果中,依此类推。