我正在使用Fortran代码在超级计算机上运行大规模模拟。我能够串行运行代码,但我希望改善转换时间。我正在寻求使它并行,我发现我可以使用自动并行化或MPI,我的问题是:哪个更有可能改善转向时间?
我能够使用带有编译器标志-parallel -par-report
的英特尔Fortran编译器来查看哪些DO
循环并行,所以如果我在4个处理器上运行编译代码,那么实际上是否可行必须做些特别的事情吗?
另外,您是否知道有任何有用的资源也可以学习MPI。我希望能够使用更多的处理器来增加模拟时间,这是我的最终目标。
答案 0 :(得分:1)
更有可能的是,MPI将比自动并行化更快。但是,自动并行化需要大约0.5秒的工作才能获得加速,比如1.2,与Y小时(甚至可能长达Q周)的试错调试相比,可以加快速度比方说,1.7。
如果你对自学MPI感兴趣,可以通过一本书,Gropp,Lusk,& Skjellum的使用MPI 可能是一个好的开始。
答案 1 :(得分:0)
回答一点取决于硬件的性质和应用程序/工作负载。您是使用多节点集群(最典型)还是大型共享内存机器?假设您是群集用户,则必须使用MPI或Fortran coarray(更可能)分布式内存跨节点并行性和SOMETHING fon节点间共享内存并行性(SMP)。
共享内存并行性可以让您加速与节点上的内核数量(使用Xeon最多32倍)或与协处理器的更多内容成比例。分布式内存并行性可以为您提供与节点数成比例的加速。这些天必须使用这两种类型(或实际上所有3种类型)的并行性来获得合理的性能。你可能会认为它像一个层次结构:1.MPI或coarray在顶部,2。用于共享内存线程的中间和3.最内层的矢量化。
嗯,从您的问题来看,这听起来像是在谈论SMP多核线程并行级别。这是并行自动并行化的行为。不要指望自动标准杆的巨大魔力。如果您希望获得更好的可扩展并行性,则必须尝试Fortran OpenMP或MPI-for-shared内存。在大多数情况下我会推荐OpenMP;它通常更容易编程和更高的性能。 但。它取决于你,你真的应该考虑更大 - 所有3个级别的并行性。如果你计划解决所有3个级别,那么可能最佳组合(因为你是一个快乐的英特尔fortran用户)是1.第一级MPI + 2.SMP级别的OpenMP + 3.在第3级由OpenMP 4.0 pragma simd引导的AutoVectorization。我不是coarray的专家,但它可能是1.MPI的好选择。
如果您不处理经典集群硬件,我的答案确实会减少。