【问题标题】:Fortran code using auto parallelization vs MPI使用自动并行化与 MPI 的 Fortran 代码
【发布时间】:2013-09-11 04:05:30
【问题描述】:

我正在使用 Fortran 代码在超级计算机上运行大规模模拟。我能够串行运行代码,但我想改进周转时间。我正在考虑使其并行化,我发现我可以使用自动并行化或 MPI,我的问题是:哪个更有可能改善周转时间?

我能够使用带有编译器标志 -parallel -par-report 的 Intel Fortran 编译器来查看哪些 DO 循环并行运行,因此,如果我在 4 个处理器上运行编译后的代码,那是否真的可以工作,或者我必须做些什么特别?

另外,你知道有什么对我有用的资源吗,我也学习 MPI。我希望能够使用更多处理器来增加模拟时间,这是我的最终目标。

【问题讨论】:

  • 如果您能够使用自动并行器,您应该能够测量运行时间,从而提高速度。你得到了什么加速?显然它不会比你有 N 个处理器的 Nx 更快,除非你打开的是自动矢量化而不是自动并行化。
  • 我可以使用自动并行器,但它仍然位于 Q 中。我能够在具有 pgf90 编译器的不同系统上使用自动矢量化,并且似乎我应该能够得到结果在 51 小时内与之前的 96 小时相比。谢谢。
  • “大规模模拟”是什么意思?在我的理解中,这意味着 >1000 个线程,只有 MPI 才能实现。
  • 可能是“大规模模拟”是错误的术语,我的意思是模拟是非常计算机密集型的,它可以在单个节点上运行,但需要 96 小时才能获得 0.25 秒实际模拟运行,我需要获得一个通常在 1 秒后发生的稳态值,大约需要 20 天。我正在剪切流中进行白细胞变形,它具有许多参数,例如表面和细胞之间的结合,并且有 10,000 个元素来模拟细胞(它是 CFD 和 FEA 的组合)。做 FFT 和蒙特卡罗方法需要很长时间。

标签: parallel-processing fortran mpi


【解决方案1】:

MPI 很有可能会比自动并行化更快。然而,与 Y 小时(甚至可能长达 Q 周)的试错调试相比,自动并行化需要大约 0.5 秒的工作才能获得 1.2 秒的加速,比如说 1.7。

如果您对通过一本书自学 MPI 感兴趣,Gropp、Lusk 和 Skjellum 的使用 MPI 可能是一个好的开始。

【讨论】:

  • 并确保您获得的是最新版本。原版只涵盖了现在已经很老的 MPI-1。即使那本书的新版本已经过时,但它仍然是目前最好的。
  • 谢谢你,我会努力去买这本书,似乎 MPI 比 OPENMP 更难,因为 MPI 的运行时间要好得多。
  • 没错,MPI 调用比 OpenMP 稍微复杂一些。完全优化的 MPI 调用是否会导致比完全优化的 OpenMP 更快的代码是有争议的。这几乎是一个“选择一个,运行它,你会没事的”类型的问题。
  • @KyleKanos 我认为您的回答具有误导性。使用 MPI 可以获得更大的加速。这取决于您正在使用的进程数。
  • OpenMP 允许在线程之间共享一些数据并减少成熟进程的内存开销,为工作空间留出更多内存,从而提高计算/(通信|同步)的限制比率。所以理论上 OpenMP 比 MPI 有更好的强缩放。在实践中,OpenMP 可能会引入非常难以发现的数据竞争条件,并将调试此类程序变成非常令人沮丧的体验。
【解决方案2】:

答案取决于您的硬件和应用程序/工作负载的性质。您使用多节点集群(最典型)还是大型共享内存机器?假设您是集群用户,您将不得不使用 MPI 或 Fortran coarray 来实现(更有可能)分布式内存跨节点并行和节点间共享内存并行 (SMP)。

共享内存并行性可以让您的速度与节点上的核心数量成正比(使用 Xeon 时最高可达 32 倍),或者使用协处理器时甚至更高。分布式内存并行性可以为您提供与节点数量成比例的加速。如今,为了获得合理的性能,必须使用两种类型(或实际上所有 3 种类型)的并行性。你可能会认为它是一个层次结构:1.MPI 或 coarray 在顶部,2.something 用于中间的共享内存线程,3.最内层的向量化。

嗯,从您的问题来看,听起来您主要是在谈论 SMP 多核线程并行级别。这就是 -parallel 自动并行化的表现。不要指望自动标准杆有很大的魔力。如果您想获得更好的可扩展并行性,您必须尝试 fortran OpenMP 或 MPI-for-shared memory。在大多数情况下,我会推荐 OpenMP;它通常更容易编程和更高的性能。 但。这取决于你,你真的应该考虑更多 - 考虑所有 3 个并行级别。如果您计划解决所有 3 个级别,那么最佳组合(因为您是一个快乐的 intel fortran 用户)可能是 1. MPI 用于 1 级 + 2. OpenMP 用于 SMP 级 + 3. AutoVectorization 由 OpenMP 4.0 pragma simd 引导在 3 级。我不是 coarray 方面的专家,但它可能是 1.MPI 的不错替代品。

如果您不处理经典的集群硬件,我的回答确实意义不大。

【讨论】:

  • 谢谢,使用 OPENMP 对我来说更有意义,因为它似乎更容易实现。
  • 好的,很高兴听到这个消息,这也是我的观点,因为它的工作量更少,通常在多核上性能更高。它仍然不是免费的午餐(即使 -parallel 也不是完全免费的午餐),因为您必须了解一些最基本的背景,但它仍然比 SMP 的 MPI 更少的程序员工作量。 intel fortran 中的 OpenMP 还将为您打开高效引导式自动矢量化的大门,这在现代超级计算机中是一个巨大的额外优势。
猜你喜欢
  • 2018-05-05
  • 2011-01-16
  • 1970-01-01
  • 2017-01-16
  • 1970-01-01
  • 2012-12-22
  • 2013-05-10
  • 2014-03-02
  • 2011-08-04
相关资源
最近更新 更多