【发布时间】:2015-11-11 12:31:32
【问题描述】:
我在分布式环境中通过 Cholesky 分解来反转矩阵,正如 here 所讨论的那样。我的代码工作正常,但为了测试我的分布式项目是否产生正确的结果,我不得不将它与串行版本进行比较。结果不完全一样!
例如,结果矩阵的最后五个单元格是:
serial gives:
-250207683.634793 -1353198687.861288 2816966067.598196 -144344843844.616425 323890119928.788757
distributed gives:
-250207683.634692 -1353198687.861386 2816966067.598891 -144344843844.617096 323890119928.788757
我曾在Intel forum 中发布过关于该问题的帖子,但我得到的答案是关于在我将使用分布式版本进行的所有执行中获得相同的结果,这是我已经拥有的东西。他们似乎(在另一个线程中)无法对此做出回应:
如何在串行执行和分布式执行之间获得相同的结果?这可能吗?这将导致修正算术错误。
我尝试设置:mkl_cbwr_set(MKL_CBWR_AVX); 并使用mkl_malloc(),以对齐内存,但没有任何改变。我会得到相同的结果,只是在我将为分布式版本生成一个进程的情况下(这将使其几乎是串行的)!
【问题讨论】:
-
每次运行串行版本时是否得到相同的结果,或者串行运行之间的结果是否存在微小差异?
-
抱歉添加了多个连续的cmets;我做了一些更多的研究,这是 HPC 和分布式计算中的一个常见问题,许多大问题和基准测试都包括验证所获得的有效性的步骤。即使是用于对世界上最快的计算机进行基准测试的High Performance Linpack (HPL) 测试也有一个步骤来验证解决问题时计算出的答案。有几种不同的技术可以验证答案,如果这是您想要追求的路线,我可以发布答案。
-
@Matt 感谢您的评论,是的,每次运行串行/分布式版本时,结果都是可重现的。问题是两个版本解决了相同的问题,使用相同的算法,但输出的结果有点不同,因为分布式执行的性质,这导致操作的顺序不同,从而产生细微的差异。问题是(如果可能的话)我如何使分布式版本给出与串行版本相同的结果。您能否详细说明您的第二条评论?
-
验证答案的一个例子是计算分布结果和实际结果之间的百分比误差。然后为有效答案设置一个阈值,例如两个结果之间的百分比误差小于 0.0001% 是否被视为有效答案?
-
是的@Matt 我就是这么想的,但我想确定一下。所以,您是说我无法在串行执行和分布式执行之间获得相同的结果,但我可以使用阈值来验证分布式答案,对吧?
标签: c++ mpi distributed-computing intel-mkl scalapack