Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法并行调用基于PETSc/MPI的外部代码_Python_Mpi_Mpi4py_Openmdao_Petsc - Fatal编程技术网

Python 无法并行调用基于PETSc/MPI的外部代码

Python 无法并行调用基于PETSc/MPI的外部代码,python,mpi,mpi4py,openmdao,petsc,Python,Mpi,Mpi4py,Openmdao,Petsc,我正在写一个OpenMDAO问题,它调用并行组中的一组外部代码。其中一个外部代码是基于PETSc的fortran FEM代码。我意识到这是一个潜在的问题,因为OpenMDAO也使用了PETSc。目前,我正在使用python的子流程调用组件中的外部代码 如果我以串行方式运行OpenMDAO问题(即python2.7omdao_problem.py),那么包括外部代码在内的一切都可以正常工作。但是,当我尝试并行运行它时(即mpirun-np 4 python2.7 omdao_problem.py)

我正在写一个OpenMDAO问题,它调用并行组中的一组外部代码。其中一个外部代码是基于PETSc的fortran FEM代码。我意识到这是一个潜在的问题,因为OpenMDAO也使用了PETSc。目前,我正在使用python的子流程调用组件中的外部代码

如果我以串行方式运行OpenMDAO问题(即python2.7omdao_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环境下是否有效吗?还有其他途径可以让它发挥作用吗?非常感谢您的任何想法或建议。

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


如果愿意,可以使用MPI生成。这种方法已经完成,但还远远不够理想。如果您可以将代码包装到内存中,并让OpenMDAO向您传递一个命令,那么您将更加高效。

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


如果愿意,可以使用MPI生成。这种方法已经完成,但还远远不够理想。如果您能将代码封装在内存中,并让OpenMDAO给您发送一条命令,您的效率会更高。

这个建议无疑为我指明了正确的方向。F2py对于简单的Fortran代码来说非常简单,但是要将它链接到PETSc有点棘手。对于其他想做同样事情的人,请参阅本文的讨论:这个建议无疑为我指明了正确的方向。F2py对于简单的Fortran代码来说非常简单,但是要将它链接到PETSc有点棘手。对于其他想做同样事情的人,请参阅本帖的讨论: