正如另一个答案提到的那样,不能保证在串行和分布式之间获得完全相同的结果。HPC/分布式工作负载的一种常见技术是验证解决方案。从计算百分比误差到更复杂的验证方案,有许多技术,例如HPL 使用的一种。这是一个计算百分比误差的简单 C++ 函数。正如@HighPerformanceMark 在他的帖子中指出的那样,对这种数值错误的分析非常复杂;这是一种非常简单的方法,网上有很多关于该主题的信息。
#include <iostream>
#include <cmath>
double calc_error(double a,double x)
{
return std::abs(x-a)/std::abs(a);
}
int main(void)
{
double sans[]={-250207683.634793,-1353198687.861288,2816966067.598196,-144344843844.616425, 323890119928.788757};
double pans[]={-250207683.634692, -1353198687.861386, 2816966067.598891, -144344843844.617096, 323890119928.788757};
double err[5];
std::cout<<"Serial Answer,Distributed Answer, Error"<<std::endl;
for (int it=0; it<5; it++) {
err[it]=calc_error(sans[it], pans[it]);
std::cout<<sans[it]<<","<<pans[it]<<","<<err[it]<<"\n";
}
return 0;
}
产生这个输出:
Serial Answer,Distributed Answer, Error
-2.50208e+08,-2.50208e+08,4.03665e-13
-1.3532e+09,-1.3532e+09,7.24136e-14
2.81697e+09,2.81697e+09,2.46631e-13
-1.44345e+11,-1.44345e+11,4.65127e-15
3.2389e+11,3.2389e+11,0
正如您所看到的,在每种情况下,误差的数量级都在 10^-13 或更少的数量级上,并且在一种情况下不存在。根据您尝试解决的问题,这个数量级的错误可能被认为是可以接受的。希望这有助于说明一种验证分布式解决方案与串行解决方案的方法,或者至少提供一种方法来显示并行算法和串行算法之间的距离。
在验证大问题和并行算法的答案时,执行多次并行算法运行也很有价值,可以保存每次运行的结果。然后,您可以查看结果和/或错误是否随并行算法运行而变化,或者它是否会随着时间的推移而稳定。
显示并行算法在超过 1000 次运行的可接受阈值内产生错误(只是一个示例,此类事情的数据越多越好)是评估结果有效性的一种方法。
过去,当我执行基准测试时,我注意到在服务器“热身”之前的前几次运行的行为差异很大。当时我从不费心检查结果中的错误是否会像性能一样随着时间的推移而稳定,但看看会很有趣。