Parallel processing 在OpenMDAO中使用具有底层并行性的代码

Parallel processing 在OpenMDAO中使用具有底层并行性的代码,parallel-processing,openmdao,Parallel Processing,Openmdao,我感兴趣的是为我们的两个OpenMDAO组件添加底层并行性。这些组件中的大部分代码都是用Fortran编写的。Fortran代码用python包装,然后作为OpenMDAO中的python模块使用。我想使用OpenMP或OpenMPI并行运行这些Fortran代码。我们已经计划使用OpenMDAO的内置并行功能,因此这将是第二层并行。这是否可行?如果是这样,您是否有一种推荐的方法可以很好地与OpenMDAO配合使用?首先,我将讨论有关OpenMP的问题。目前OpenMDAO本身并不使用OpenM

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

首先,我将讨论有关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))
这段代码告诉框架分布式数据是如何在多个进程中被分割的。这种方法的细节在不同的实现中会有很大的差异。在某些情况下,您可能让所有进程都拥有所有数据。在其他情况下(如本例),您将在整个过程中均匀分布数据。在其他情况下,您可能同时拥有全局数据和分布式数据

如果您计划只使用OpenMP,您可能会在所有进程之间共享所有数据,但仍会请求超过1个进程。通过这种方式,您可以确保OpenMDAO为您的comp分配了足够多的进程,使其在多线程环境中有用。您将获得一个comm对象,可以使用它来分配任务

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


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

这正是我现在需要知道的。谢谢。我想我应该留下一个更新:我们现在已经使用MPI和OpenMP与OpenMDAO成功运行了多个并行级别。到目前为止似乎还不错。