【问题标题】:Unable to call PETSc/MPI-based external code in parallel OpenMDAO无法并行调用基于 PETSc/MPI 的外部代码 OpenMDAO
【发布时间】:2017-08-13 18:46:33
【问题描述】:

我正在编写一个调用并行组中的一组外部代码的 OpenMDAO 问题。这些外部代码之一是基于 PETSc 的 fortran FEM 代码。我意识到这可能存在问题,因为 OpenMDAO 也使用 PETSc。目前,我正在使用python的子进程调用组件中的外部代码。

如果我以串行方式运行我的 OpenMDAO 问题(即 python2.7 omdao_problem.py),包括外部代码在内的所有内容都可以正常工作。但是,当我尝试并行运行它时(即 mpirun -np 4 python2.7 omdao_problem.py),它会一直运行到子进程调用,此时我收到错误:

*** Process received signal ***
Signal: Segmentation fault: 11 (11)
Signal code: Address not mapped (1)
Failing at address: 0xe3c00
[ 0] 0   libsystem_platform.dylib            0x00007fff94cb652a _sigtramp + 26
[ 1] 0   libopen-pal.20.dylib                0x00000001031360c5 opal_timer_darwin_bias + 15469
 *** End of error message ***

对此我不能说太多,但在我看来,问题来自使用基于 MPI 的 python 代码调用另一个启用 MPI 的代码似乎是合理的。我尝试在外部代码的位置使用非 mpi“hello world”可执行文件,并且可以由并行 OpenMDAO 代码调用而不会出错。我不需要外部代码实际并行运行,但我确实需要使用 PETSc 求解器等,因此对 MPI 的固有依赖。 (我想我可以考虑同时使用支持 MPI 和不支持 MPI 的 PETSc 构建?如果可能的话,我宁愿不这样做,因为我可以看到这很快就会变得一团糟。)

我发现this discussion 似乎存在类似的问题(并进一步指出,正如我所做的那样,在 MPI 代码中使用子进程是不可以的)。在这种情况下,看起来使用 MPI_Comm_spawn 可能是一种选择,即使它不适合这种用途。知道这是否可以在 OpenMDAO 的上下文中工作吗?寻求使其发挥作用的其他途径?非常感谢任何想法或建议。

【问题讨论】:

    标签: python mpi mpi4py openmdao petsc


    【解决方案1】:

    您不需要将外部代码作为子进程调用。使用 F2py 在 python 中包装 fortran 代码并将一个 comm 对象向下传递到其中。 This docs example 展示了如何使用使用 comm 的组件。

    如果你愿意,你可以使用 MPI spawn。这种方法已经完成,但远非理想。如果您可以将代码包装在内存中并让 OpenMDAO 向您传递一个 comm,那么您的效率会高得多。

    【讨论】:

    • 这个建议确实为我指明了正确的方向。对于简单的 Fortran 代码,F2py 使用起来相当简单,但是让它链接 PETSc 有点棘手。对于其他想要做同样事情的人,请参阅此帖子的讨论:stackoverflow.com/questions/42978049/…
    猜你喜欢
    • 1970-01-01
    • 2017-05-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多