1

我正在编写一个 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 构建?如果可能的话,我宁愿不这样做,因为我可以看到这很快就会变得一团糟。)

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

4

1 回答 1

0

您不需要将外部代码作为子流程来调用。使用 F2py 将 fortran 代码包装在 python 中,并向下传递一个 comm 对象。此文档示例展示了如何使用使用 comm 的组件。

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

于 2017-03-21T21:51:46.930 回答