在多个机器上的子例程中分配独立迭代

时间:2014-02-03 20:37:34

标签: parallel-processing fortran distributed-computing

我有一个用Fortran编写的应用程序,有一个特定的子程序调用需要很长时间才能执行。我想知道是否可以在多个节点上分配计算任务。 代码的当前串行流如下:

D = Some computations that give me D and it is in memory
subroutine call

<within the subroutine>

iteration from 1 .. n
{

  independent operations on D
}

我希望在n / 4台机器上分发迭代。有人可以指导我吗?如果事情不是很清楚,请告诉我!

2 个答案:

答案 0 :(得分:3)

根据底层实现,coarrays(F2008)可能允许处理分布在多个节点上。跨越图像划分迭代空间是相对简单的,将结果传送回一个图像(或所有图像)是可能出现某些复杂性的地方。可以找到关于coarray的一些介绍性材料here

同样,根据底层实现,DO CONCURRENT(F2008)可能允许并行处理迭代(尽管不太可能跨越节点)。在DO CONCURRENT构造的范围内可以做的事情存在限制,这意味着迭代可以按任何顺序执行,适当能力的编译器可能能够将其进一步转换为并发执行。

答案 1 :(得分:1)

当一个人有现有代码并想要逐步并行化(或只是一个例行程序)时,共享内存方法就是“快速命中”。特别是当已知迭代是独立的时,我首先建议查看自动并行化的编译器标志,语言结构如DO CONCURRENT(感谢@IanH提醒我)和OpenMP编译器指令。

然而,我的扩展评论是关于分布式内存的,我会谈到它。

我假设您无权访问所有潜在计算机上的某些高级进程生成设置。也就是说,无论正在做什么工作,您都会在各个机器上运行进程,每个进程都按时收费。然后,工作流程看起来像

  • 串行外环
    • 计算D
    • D分发到并行环境
      • D
      • 子集上的内部并行循环
    • 在主人
    • 上收集D

如果并行环境中的处理器/进程没有做任何其他事情 - 或者无论如何都要收费 - 那么这与你一样

  • 外环
    • 所有流程都会计算D
    • 每个流程都适用于D
    • 的子集
    • 同步D

通信方面,MPI或coarrays(我在这种情况下推荐,再次看到@ IanH的答案,其中图像同步等仅限于带有[..]的几个循环)这里就是同步。

作为尾注:多机coarray支持非常有限。 ifort据我所知,需要超出基本版本的许可证,g95有一些支持,Cray编译器可能会很好。然而,这是一个单独的问题。 MPI将得到很好的支持。