MPI_REDUCE阵列表示十进制值(C)



i具有一个顺序程序,该程序计算数字值并将结果存储在一个数组中,其中每个元素代表一个数字"位置"。

例如,计算结果[2,4,5,1,1,8,9,3,1]表示2.45118931

的小数值

格式是这样的结果[0]是小数点左侧的值,结果[1-n]代表十分位数的十分之一,百分之一等。

每个处理器的计算结果都进入数字,并将其简化为MpiResult:

        long unsigned int *digits;
        long unsigned int *mpiResult;

每个过程都计算出其部分,我想找到合并的值结果。

我无法以能给我带来我想要的结果的方式实现mpi_reduce。

我到目前为止最接近:

MPI_Reduce(digits, mpiResult, d, MPI_UNSIGNED_LONG, MPI_SUM, MPI_COMM_WORLD);

据我了解,如果我有两个带有以下值的过程

,则还原总和如何与数组一起工作
[2][3][4][1][9] (2.3419)

[2][6][6][7][3] (2.6673)

总和的结果应为 5.0092

但是,减少总和会给我带来的价值:

[4][9][10][8][12] (4.910812)

因为它在所有过程中总结了每个元素。

如何使用mpi_reduce获取我要寻找的结果格式?还是我完全没有这种方法?

您的实现唯一的问题是,您不会在数字之间传播携带:数字单独求和,您只需要添加一个小的后处理步骤

pseudocode(要小心,因为最后一行是从界限中写出的,实际上,您可能需要继续此循环直到carry == 0):

for i = n ... 1
    carry = digit[i] / 10      # compute the carry to the next digit
    digit[i] %= 10             # only leave the least significant digit
    if carry != 0
        digit[i - 1] += carry  # add the carry to the next higher digit

在您的情况下,您会得到

[4][9][10][8][12]           
[4][9][10][9][2]
[4][10][0][9][2]
[5][0][0][9][2] -> 5.0092

但是,如果您决定添加6.1582和7.4638

,则需要在最重要的数字前分配其他空间

另一种可能的方法是实现自定义的MPI数据类型和用户定义的操作以在减少过程中传播携带,但是为此,您可能需要确保有足够的空间可以包含结果减少。

最新更新