我有一个双精度数组,它在进程之间分块并分布。但是,这些块对应于整数索引位置,该位置可以在其他块上重复。如何计算与重复的整数位置索引相对应的double值?
例如,我们有一个大小为9的数组,分为两个处理器。每个处理器上的数组值的屏幕输出为
proc=0
idx value
1 0.4324
2 0.5
3 0.7433
proc=1
idx value
2 1.0
4 0.432
5 0.406
6 0.843
该代码的理想行为是发现idx = 2是重复的,因此索引位置= 2的平均值应为(0.5 + 1.0)/2.0 = 0.75。
我的想法是执行MPI_Send / Recv并比较整数。然后,以某种方式,对于那些重复的值,对关联的双精度值求平均值,并替换数组中的平均值。
sbuf(:) = indexarr(:)
sbufdouble(:) = values(:)
do iproc=1,nproc
call MPI_Send(sbuf, size(sbuf), MPI_REAL, iproc...
! Should I send the double values as well?
enddo
do iproc=1,nproc
call MPI_Recv(rbuf,...)
enddo
! Do some comparison between rbuf and the array chunk
indexarr owned by this processor
! If integers match, average the corresponding double values
between the two
! Replace the averaged value in indexarr(:)