我正在写一个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?为实现这一目标而采取的其他途径是什么?非常感谢任何想法或建议。
答案 0 :(得分:0)
您无需将外部代码作为子流程调用。使用F2py在python中包装fortran代码并将comm对象传递给它。 This docs example显示了如何使用使用comm的组件。
如果您愿意,可以使用MPI spawn。这种方法已经完成,但它远非理想。如果你可以将代码包装在内存中并让OpenMDAO传递给你一个comm,你将会更有效率。