1

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

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

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

4

2 回答 2

1

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

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

于 2013-09-07T01:31:04.920 回答
0

回答有点取决于您的硬件和应用程序/工作负载的性质。您使用多节点集群(最典型)还是大型共享内存机器?假设您是集群用户,您将不得不使用 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 的不错替代品。

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

于 2013-09-07T11:46:40.643 回答