我正在编写一个 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 的上下文中工作吗?寻求使其发挥作用的其他途径?非常感谢任何想法或建议。