表示十进制值的MPI_Reduce数组(C)

时间:2017-12-12 19:11:09

标签: c parallel-processing mpi openmpi

我有一个顺序程序,它计算数值并将结果存储在一个数组中,其中每个元素代表一个数字“place”。

例如,计算结果[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获取我正在寻找的结果格式?或者我完全偏离了这种方法?

1 个答案:

答案 0 :(得分:3)

您实施的唯一问题是您不会在您的数字之间传播进位: 单独的数字正确总结,您只需要添加一个小的后处理步骤

伪代码(小心最后一行写出界限,实际上你可能需要继续这个循环直到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数据类型和user-defined operation以在减少期间传播进位,但是为此,您可能需要确保在启动之前有足够的空间来包含结果减少。