GetFEM のMPI並列化¶
当然ながら,各問題は,良好な負荷分散を行うために,それぞれ固有な事情に合わせて異なる並列化が必要となります.このライブラリではメッシュ領域を使用して自身で並列化を行い,行列の構築を並列化することができます.
併せて,ブリック要素系は Open MPI (プロセス間の通信), METIS (メッシュの分割)および MUMPS (並列化された疎行列直接解法)に基づく汎用的な並列化を提供しています.この機能はコンパイラオプション -D GETFEM_PARA_LEVEL = 2
で利用でき,ライブラリ自体はconfigureスクリプトの --enable-paralevel=2
オプションでコンパイルする必要があります. GetFEM の初期のMPI並列化は,CALMIP大学のNicolas RenonとToulouseの助けを借りて設計されています.
configureスクリプトを --enable-paralevel=2
オプションで実行すると,MPI,METIS,および並列MUMPSライブラリが検索されます.Pythonインタフェースが構築されている場合は,MPI4PYライブラリも検索します.その場合,pythonインタフェースを使用してgetfemの並列版を実行することができます(他のインタフェースは現時点では並列化されていません).interface/test/python ディレクトリの demo_parallel_laplacian.py を参照してください.
-D GETFEM_PARA_LEVEL = 2
オプションを使用すると,使用される各メッシュは(METISを使用して)プロセッサの数に対応するいくつかの領域に暗黙的に分割され,構築手順が並列化されます.つまり,model_state変数にアセンブルされた接線行列と制約行列が分散されているということです.(今のところ)ベクトルを分散することはできません. model_state変数の右手側のベクトルが各プロセッサに伝達されるようになっています(それぞれの計算結果の積分は構築の最後で行われ,各プロセッサは完全なベクトルを持ちます).ブリック要素により格納された行列はすべて分散されているということに注意してください.
C++の並列プログラムの雛形は tests/elastostatic.cc
です.並列で計算するためには次のように実行します.
mpirun -n 4 elastostatic elastostatic.param
Pythonインタフェースのプログラムの場合,呼び出しは次の通りです.
mpirun -n 4 python demo_parallel_laplacian.py
make install を実行しない場合は,最初にシェル変数 PYTHONPATH を python-getfem ライブラリに設定することを忘れないでください
export PYTHONPATH=my_getfem_directory/interface/src/python
GetFEM MPIの並列化の進捗状況¶
getfemの並列化は引き続き「進行中の作業」になります.一定数のプロセスが依然としてシーケンシャルです.ご存知のとおり,プログラムの並列化が正確かどうかを確認する良いテストは,計算結果がプロセスの数とは無関係であることを検証することです.
構築手順
構築手順の大部分は(
getfem/getfem_assembling.h
を参照)構築が計算される領域に対応するパラメータを持っています.それらは並列化されていませんが,ジョブを分配するために各プロセスで異なる領域を呼ぶことが望ましいです.ファイルgetfem/getfem_config.h
には分散疎行列の処理結果を集約するための MPI_SUM_SPARSE_MATRIX という手順が含まれています.以下の構築手順は,
-D GETFEM_PARA_LEVEL=2
オプションを使用して暗黙的に並列化されます.ノルムの計算(
getfem/getfem_assembling.h
内のasm_L2_norm
,asm_H1_norm
,asm_H2_norm
),asm_mean_value
(getfem/getfem_assembling.h
を参照),error_estimate
(getfem/getfem_error_estimate.h
を参照).
つまり,これらの関数を各プロセッサで呼び出す必要があります.
Mesh_femオブジェクト
getfem :: mesh_femオブジェクトの自由度ナンバリングは連続のまま,各プロセスで実行され,並列化が行われます.これは,非常に大きなメッシュまたは縮閉メッシュの並列化の効率に影響する可能性があります.
Modelオブジェクトとブリック要素
モデルシステムは全体的に並列化されています.これは主に,標準ブリック要素の構築手順がメッシュのMETISパーティションを使用して構築を分配しているためです.接線/剛性行列は分散したままであり,標準解法はMUMPS(分散行列を受け入れる)の並列版が呼び出されます.
現時点では,modelオブジェクトの
actualize_sizes()
手順はシーケンシャルなままで,各プロセスで実行されます.並列化はこれからです.いくつかの特異性 :
陽な質量行列: 与えられた行列は分散されているものとみなされます.そうでない場合は,マスタープロセスにのみ追加してください(その他の場合は,プロセスの数で寄与分が掛けられます).
陽な右辺ブリック要素: 与えられたベクトルは分散しているとはみなされません.マスタプロセス上に指定されたベクトルのみが考慮されます.
拘束ブリック要素: 与えられた行列と右辺は分配されているとはみなされません.マスタプロセス上に指定された行列とベクトルのみが考慮されます.
接触ブリック要素に関しては,一体型接触ブリック要素のみが完全に並列化されています.節点接触ブリック要素は並列で動作しますが,すべての計算はマスタープロセスで実行されています.