2

我有兴趣为我们的几个 OpenMDAO 组件添加底层并行性。这些组件中的大部分代码都是用 Fortran 编写的。Fortran 代码封装在 python 中,然后在 OpenMDAO 中用作 python 模块。我想使用 OpenMP 或 OpenMPI 并行运行这些 Fortran 代码。我们已经计划使用 OpenMDAO 的内置并行功能,因此这将是第二层并行。这可行吗?如果是这样,您是否有推荐的方法可以很好地与 OpenMDAO 配合使用?

4

1 回答 1

3

首先,我将解决有关 OpenMP 的问题。目前 OpenMDAO 本身不使用 OpenMP,我们也没有任何计划在短期内改变它。所以这意味着,我们的框架并不真正知道或关心你是否碰巧在你的 Fortran 代码中使用它。随意,当然,关于 MPI + OpenMP 代码的所有正常警告都有效!

如果您想在组件本身中使用 MPI 并行性,OpenMDAO 直接支持。对于这种情况,我们有一个相当简单的教程,组件本身想要多个处理器。本教程的显着特点是组件要求框架提供多个处理器:

def get_req_procs(self):
    """
    min/max number of cpus that this component can use
    """
    return (1,self.size)

在这种情况下,组件将接受从 1 个 proc 到其数组中元素数量的任何地方。在您的情况下,您可能希望将其限制为单个值,在这种情况下您可以返回单个整数。

另一个值得注意的部分是:

def setup_distrib_idxs(self):
    """
    specify the local sizes of the variables and which specific indices this specific
    distributed component will handle. Indices do NOT need to be sequential or
    contiguous!
    """

    comm = self.comm
    rank = comm.rank

    #NOTE: evenly_distrib_idxs is a helper function to split the array up as evenly as possible
    sizes, offsets = evenly_distrib_idxs(comm.size, self.size)
    local_size, local_offset = sizes[rank], offsets[rank]
    self.local_size = int(local_size)

    start = local_offset
    end = local_offset + local_size

    self.set_var_indices('x', val=np.zeros(local_size, float),
        src_indices=np.arange(start, end, dtype=int))
    self.set_var_indices('y', val=np.zeros(local_size, float),
        src_indices=np.arange(start, end, dtype=int))

此代码告诉框架您的分布式数据如何在多个 proc 中拆分。这种方法的细节在不同的实现中会有很大的不同。在某些情况下,您可能让所有 proc 拥有所有数据。在其他情况下(例如这个),您将在整个过程中均匀分布数据。在其他情况下,您可能拥有全局数据和分布式数据的组合。

如果您计划仅使用 OpenMP,您可能会在所有进程之间共享所有数据,但仍会请求超过 1 个 proc。这样,您可以确保 OpenMDAO 为您的 comp 分配了足够的 proc,以便它在多线程上下文中有用。您将获得一个通讯对象,您可以使用它来划分任务。

如果您计划使用纯粹的 MPI,那么您很可能(尽管不确定)将使用分布式数据。您仍然需要请求超过 1 个 proc,但您还必须拆分数据。

如果您决定使用 OpenMP 和 MPI,那么可能需要某种分布式和共享数据的组合。

于 2015-10-27T03:45:54.850 回答