2017-03-21 2 views
1

並列グループに外部コードのグループを呼び出すOpenMDAO問題を書いています。これらの外部コードの1つはPETScベースのfortran 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対応コードを呼び出すことに起因すると考えられます。私は外部コードの場所に非mpiの "hello world"実行可能ファイルを使用しようとしましたが、エラーなしで並列OpenMDAOコードで呼び出すことができます。実際には並列コードを実行する必要はありませんが、PETScソルバーなどを使用する必要があります。そのため、MPIに固有の依存性があります。 (私は、MPI対応と非MPI対応のPETScの両方を敷設することを検討することができると思いますが、急いで混乱することがわかっているので、できるだけそれをしたくないでしょう)

I this discussionが同様の問題を呈していることがわかりました(そして、私がやっているように、MPIコードでサブプロセスを使用すると、no-noです)。その場合、MPI_Comm_spawnを使用するように見えるのは、その使用を意図していないとしても、オプションである可能性があります。それがOpenMDAOの文脈でうまくいくかどうか?これを稼働させるために追求する他の手段?どんな考えや提案も大変ありがとうございます。

答えて

0

外部コードをサブプロセスとして呼び出す必要はありません。 F2pyを使用してFortranコードをPythonにラップし、通信オブジェクトを渡します。 This docs exampleは、通信を使用するコンポーネントを使用する方法を示しています。

必要に応じて、MPIのスポーンを使用できます。このアプローチは行われていますが、それは理想から遠いです。メモリにコードをラップし、OpenMDAOに通信を渡すことができれば、はるかに効率的になります。

+1

この提案は間違いなく正しい方向に私を指摘しました。 F2pyは単純なFortranコードにはかなり簡単に使用できますが、PETScをリンクするには少し難解でした。同じことをしたいと思う他の人のために、この記事の議論を参照してください:http://stackoverflow.com/questions/42978049/unable-to-use-f2py-to-link-large-petsc-slepc-fortran-コード?noredirect = 1#comment73227077_42978049 – aherrema

関連する問題