2017-03-21 5 views
1

병렬 그룹에 외부 코드 그룹을 호출하는 OpenMDAO 문제를 씁니다. 이러한 외부 코드 중 하나는 PETSc 기반 포트란 FEM 코드입니다. OpenMDAO가 PETSc를 사용하기 때문에 이것이 잠재적으로 문제가 있다는 것을 알고 있습니다. 현재 Python의 하위 프로세스를 사용하여 구성 요소에서 외부 코드를 호출하고 있습니다.병렬로 PETSc/MPI 기반 외부 코드를 호출 할 수 없습니다. OpenMDAO

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 지원 코드를 호출 할 때 문제가 발생할 수 있습니다. 외부 코드의 장소에서 non-mpi "hello world"실행 파일을 사용해 보았습니다.이 파일은 오류없이 병렬 OpenMDAO 코드에서 호출 할 수 있습니다. 실제로 병렬로 실행하는 데 외부 코드가 필요하지 않지만 PETSc 솔버 등을 사용해야하므로 MPI에 내재 된 의존성이 있습니다. (PETM의 MPI 기반 및 비 MPI 기반 빌드를 모두 고려해 볼 수 있다고 생각할 수 있습니다. 서둘러 엉망이되는 것을 볼 수있는 한 가능한 한 수행하지 않는 것이 좋습니다.)

I this discussion이 비슷한 문제를 일으키는 것으로 나타났습니다. (그리고 내가하는 것처럼 MPI 코드에서 서브 프로세스를 사용하는 것은 더이상 아니오라고 말합니다.) 이 경우에는 MPI_Comm_spawn을 사용하는 것이 옵션 일 수 있지만, 그 용도로 사용되지는 않습니다. 그것이 OpenMDAO의 맥락에서 작동 할 것이라는 아이디어는 있습니까? 이 기능을 사용하기 위해 추구 할 다른 방법은 무엇입니까? 어떤 생각이나 제안이라도 대단히 감사합니다.

답변

0

외부 코드를 하위 프로세스로 호출 할 필요가 없습니다. P2py를 사용하여 포트란 코드를 파이썬으로 감싸고 통신 객체를 전달합니다. This docs example은 통신을 사용하는 구성 요소를 사용하는 방법을 보여줍니다.

원하는 경우 MPI 스폰을 사용할 수 있습니다. 이 접근법은 끝났지 만 이상적인 것은 아닙니다. 코드를 메모리에 랩핑하고 OpenMDAO가 통신을 전달할 수 있다면 훨씬 더 효율적입니다.

+1

이 제안은 나를 올바른 방향으로 분명히 지적했습니다. F2py는 간단한 포트란 코드에 사용하는 것이 상당히 간단하지만 PETSc를 연결하기에는 약간 까다 롭습니다. 같은 일을하고 싶은 다른 사람들을 위해이 게시물의 토론을 참조하십시오 : http://stackoverflow.com/questions/42978049/unable-to-use-f2py-to-link-large-petsc-slepc-fortran- code? noredirect = 1 # comment73227077_42978049 – aherrema

관련 문제