收集MPI_扫描结果

收集MPI_扫描结果,mpi,openmpi,prefix-sum,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

我有这个阵列[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\U扫描的功能。它对存储在每个节点上的输入数组的每个第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
(添加
6
之前任务1中扫描的最后一个元素)添加到下一次扫描的所有元素中,以此类推

[ 1  3  6][10 15 21][13 21 30]
                    +15 ---->
                    =
[ 1  3  6][10 15 21][28 36 45]
或者,您可以仅将
6
添加到第二次扫描的结果中,然后将
21
添加到第三次扫描的结果中,依此类推

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

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

你是否正在尝试实现自己的扫描操作?因为这不是MPI\U扫描的功能。它对存储在每个节点上的输入数组的每个第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
(添加
6
之前任务1中扫描的最后一个元素)添加到下一次扫描的所有元素中,以此类推

[ 1  3  6][10 15 21][13 21 30]
                    +15 ---->
                    =
[ 1  3  6][10 15 21][28 36 45]
或者,您可以仅将
6
添加到第二次扫描的结果中,然后将
21
添加到第三次扫描的结果中,依此类推

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

也许你可以通过MPI操作找到一些聪明的方法来实现这一点。

+1;可以通过对阵列的最后一个元素进行MPI_扫描(例如,获取6和15)来实现上述功能,然后按照上述步骤进行操作,但如果所有内容都将发送到处理器0,这是一种更好的方法,因为没有额外的通信开销;可以通过在阵列的最后元素上使用MPI_扫描(例如,获取6和15)来实现上述功能,然后如上所述进行操作,但如果所有内容都将发送到处理器0,这是一种更好的方法,因为没有额外的通信开销。