并联OpenMDAO基于MPI无法调用PETSc的/外部码(Unable to call PETSc

2019-09-30 14:42发布

我写的是一个平行组调用一组外部代码的OpenMDAO问题。 其中一个外部码是一个基于的PETSc-FORTRAN FEM代码。 我意识到这是潜在的问题,因为OpenMDAO也利用PETSc的。 目前,我正在使用Python的子进程调用组件的外部代码。

如果我运行在串行(即python2.7 omdao_problem.py)我OpenMDAO问题,一切,包括外部代码,工作得很好。 当我尝试但是并行运行它,(即的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的环境中工作? 其他途径来追求得到这个工作? 任何想法或建议,不胜感激。

Answer 1:

你不需要调用外部代码作为一个子进程。 使用F2py包裹FORTRAN代码在python并传递一个通讯对象分解成它。 该文档举例说明了如何与使用通讯组件协同工作。

你可以使用一个MPI产卵,如果你想。 这种方法已经完成,但它远非理想。 你会更有效,如果你可以用在内存中的代码,让OpenMDAO传给你一个通讯。



文章来源: Unable to call PETSc/MPI-based external code in parallel OpenMDAO