【发布时间】:2014-08-17 10:21:53
【问题描述】:
在我的代码中,我在所有变量类型为 double[] 的 C++ 代码中进行了乘法运算
f1[0] = (f1_rot[0] * xu[0]) + (f1_rot[1] * yu[0]);
f1[1] = (f1_rot[0] * xu[1]) + (f1_rot[1] * yu[1]);
f1[2] = (f1_rot[0] * xu[2]) + (f1_rot[1] * yu[2]);
f2[0] = (f2_rot[0] * xu[0]) + (f2_rot[1] * yu[0]);
f2[1] = (f2_rot[0] * xu[1]) + (f2_rot[1] * yu[1]);
f2[2] = (f2_rot[0] * xu[2]) + (f2_rot[1] * yu[2]);
对应这些值
Force Rot1 : -5.39155e-07, -3.66312e-07
Force Rot2 : 4.04383e-07, -1.51852e-08
xu: 0.786857, 0.561981, 0.255018
yu: 0.534605, -0.82715, 0.173264
F1: -6.2007e-07, -4.61782e-16, -2.00963e-07
F2: 3.10073e-07, 2.39816e-07, 1.00494e-07
这种乘法尤其会产生错误的值 -4.61782e-16 而不是 1.04745e-13
f1[1] = (f1_rot[0] * xu[1]) + (f1_rot[1] * yu[1]);
我在计算器上手动验证了其他乘法,它们似乎都产生了正确的值。
这是一个开放的 mpi 编译代码,上面的结果是针对运行单个处理器的,运行多个处理器时会有不同的值,例如 40 个处理器产生 1.66967e-13 作为 F1[1] 乘法的结果。
这是某种 mpi 错误吗?还是类型精度问题?为什么它适用于其他乘法?
【问题讨论】:
-
MPI 提示竞争条件:数学几乎从来都不是错误。
-
什么是 f1_rot[0] 和 f1_rot[1]/
-
是的,我还要说你产生了一个竞争条件。也许您在显示的代码之前忘记了一些障碍(
f1_rot、xu等。在执行乘法之前没有可靠地设置)。 -
@user3344003 Force Rot1 和 Force Rot2
标签: c++ multiplication openmpi double-precision