MPI_Reduce 表示十进制值的数组 (C)
MPI_Reduce arrays representing decimal values (C)
我有一个顺序程序,它计算数值并将结果存储在一个数组中,其中每个元素代表一个数字 "place."
例如计算结果[2,4,5,1,1,8,9,3,1]
表示十进制值2.45118931
格式为result[0]为小数点左边的值,result[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 来获得我正在寻找的结果格式?还是我完全不适合这种方法?
您的实现的唯一问题是您没有在数字之间传播进位:
每个数字都正确地总结了,你只需要添加一个小的后处理步骤
伪代码(小心最后一行写越界,事实上你可能需要继续这个循环直到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
之类的内容,则需要在最高有效数字前分配额外的 space
另一种可能的方法是实现自定义 MPI 数据类型和 user-defined operation 以在缩减期间传播进位,但是为此,您可能需要确保有足够的 space在开始减少之前包含结果。
我有一个顺序程序,它计算数值并将结果存储在一个数组中,其中每个元素代表一个数字 "place."
例如计算结果[2,4,5,1,1,8,9,3,1]
表示十进制值2.45118931
格式为result[0]为小数点左边的值,result[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 来获得我正在寻找的结果格式?还是我完全不适合这种方法?
您的实现的唯一问题是您没有在数字之间传播进位: 每个数字都正确地总结了,你只需要添加一个小的后处理步骤
伪代码(小心最后一行写越界,事实上你可能需要继续这个循环直到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
之类的内容,则需要在最高有效数字前分配额外的 space另一种可能的方法是实现自定义 MPI 数据类型和 user-defined operation 以在缩减期间传播进位,但是为此,您可能需要确保有足够的 space在开始减少之前包含结果。