在MPI 科学代码上测试可压缩流动动力学我注意到结果可能取决于用于计算的处理器数量。事实上,比较二进制文件它们在10.0E-10 ~ 10.0E-11左右不同
由于我正在优化应用程序并且几乎从零开始重写它,我想知道是否可以使结果独立于 MPI 进程的数量。
如果是,如何进行?
哪些事情要避免,哪些事情要做?
在MPI 科学代码上测试可压缩流动动力学我注意到结果可能取决于用于计算的处理器数量。事实上,比较二进制文件它们在10.0E-10 ~ 10.0E-11左右不同
由于我正在优化应用程序并且几乎从零开始重写它,我想知道是否可以使结果独立于 MPI 进程的数量。
如果是,如何进行?
哪些事情要避免,哪些事情要做?
这是并行计算的一个非常常见的问题。从技术上讲,如果 MPI 并行代码中的通信模式足够复杂,那么即使使用相同数量的处理器运行,最终结果也可能会略有不同。
现在,处理该问题的策略将有很大不同,具体取决于并行化的内容和方式。“结果波动”的常见来源之一是减少(由于浮点运算的非关联性)。
你可以做几件事。首先,看看这个关于 MPI 减少再现性的 CompSci 问题。Jed 的回答很好地概述了有关减少的问题,并建议为相同和不同数量的处理器获得稳定的结果。
简而言之,并行进行计算,直到您需要将它们“合并”在一起(减少)。要合并它们,请将它们收集在一个处理器(通常称为主节点)上并执行所需的一组操作。在本地做最后一步时,您可以负责操作顺序。
但是,减少并不是唯一可能的来源:因为您的问题分区(网格分区等)可能已经引入了另一个“波动”来源。所以,我建议
关联性问题在其他答案中得到解决(请参阅我的评论);它主要在集体中发挥作用。另一件要注意的是不要使用通配符接收。如果传入消息的顺序不确定,则关联性问题再次出现。