0

我有一个用于动力学的 Fortran 程序(基本上是一个 verlet 算法)。为了更快地计算速度,我将算法与 MPI 并行化。让我紧张的是,如果我有四个处理器,每个处理器都运行一个 Verlet,当它们达到并行化点时,它们会共享信息。然而,由于微小的数值差异(例如,在每个节点上编译的 LAPACK 中),从长远来看,每个 Verlet 轨迹可能会朝着完全不同的方向发展,这意味着在共享点我将获得来自不同的信息的混合轨迹。因此,我决定在每个时间步同步信息以防止分歧,但这显然引入了一个障碍。

这个问题(节点的分歧)通常是如何解决的?有什么参考吗?

4

1 回答 1

1

好吧,你不应该在每个节点上有不同的 LAPACK 编译。如果您的数值库在模拟的不同部分发生变化,您应该会看到奇怪的结果——这与并行性无关。所以不要那样做。

我唯一真正看到 MPI 在这种情况下引入技巧是,像 MPI_REDUCE(...MPI_SUM...) 这样的操作可能会导致在不同运行中相同数量的节点上产生不同的答案,因为总和可以是以不同的顺序。这只是标准的“浮点数学不通勤”的东西。您可以通过对相关数字执行 MPI_GATHER() 并以某种明确定义的顺序对它们求和来避免这种情况,例如在数量级从最低到最高排序之后。

于 2011-04-29T15:43:50.077 回答