並列有限要素計算でメッシュを管理するための最良の方法論?


11

現在、散乱の問題を解決するためのドメイン分解法を開発しています。基本的に、ヘルムホルツBVPのシステムを反復的に解いています。三角形または四面体メッシュ上の有限要素法を使用して方程式を離散化します。私は博士論文に向けてコードを開発しています。deal.iiやDUNEなど、既存の有限要素ライブラリのいくつかを知っています。インスピレーションに満ちたデザインとAPIを備えたすばらしいものだと思いますが、学習目的で、自分の小さなアプリケーションをゼロから開発したいと考えました。

私はシリアルバージョンを実行している時点で、それらを並列化したいと思っています。結局のところ、少なくとも原則として並列化が容易なアルゴリズムを策定することは、ドメイン分解フレームワークの強みの1つです。しかし実際には、考慮しなければならない多くの詳細があります。メッシュ管理もその1つです。アプリケーションが多くのCPUに適切にスケーリングしながら高解像度を実現する場合、すべてのCPUでのメッシュ全体の複製は非効率的です。

高性能コンピューティング環境で同様のアプリケーションに取り組んでいる開発者に、この問題への対処方法を尋ねたいと思いました。

分散メッシュ管理用のp4estライブラリがあります。私はAMRを必要としないので、均一なメッシュの使用にのみ関心があり、三角形メッシュを洗練できるかどうかはわかりません。また、単純に均一なメッシュを作成し、それをメッシュパーティショナーの1つに供給して、出力の後処理を行うこともできます。

最も単純なアプローチは、特定のパーティションのみに関連するメッシュ情報を含むパーティションごとに個別のファイルを作成するようです。このファイルは、メッシュのその部分で個別のシステムを組み立てる単一のCPUによって読み取られます。もちろん、プロセス間通信のために、一部のグローバルパーティションの接続性/近隣情報も、すべてのCPUが読み取るファイルに保存する必要があります。

他にどのようなアプローチがありますか?皆さんが共有できる場合、業界で一般的に使用されている方法論や、この問題の処理に関連する政府研究機関は何ですか?並列有限要素ソルバーをプログラミングするのは初めてで、この問題について正しく考えているかどうか、他の人がどのように近づいているのかを知りたいと思いました。関連する研究記事へのアドバイスやポインタは大歓迎です!

前もって感謝します!


メッシュパーティショナーを探しているなら、METISが良い選択でしょう。ParMETISも確認してください。メッシュの管理は別の話です。ITAPSiMeshはあなたのためのソリューションです。ここにも私の質問のための答えを確認してください:scicomp.stackexchange.com/questions/4750/...
クシシュトフBzowski

@KrzysztofBzowski:おそらくスコッチライブラリも使用しましたか?有限要素に関しては、スコッチとメティスの違いは何だろうと思っていました。iMeshプロジェクトは非常に興味深いようです。これについては、今後数日で詳しく説明します。私はdeal.IIとDUNEについて知っています。しばらく前にopenMeshを検討したことを覚えていますが、必要な機能をゼロから実装する方が簡単だと考えました。シーケンシャルメッシュの場合、基本的には、このペーパーリンクに示されているハーフエッジ/フェースデータ構造を適用しました。
midurad

回答:


7

AMRを使用しておらず、1K-4Kコアを超えて拡張したくない場合は、単にこれを行います。

  1. ランク0は、メッシュ全体を読み取り、METIS / Scotchなどを使用してメッシュを分割します(注:これはシリアル操作です)。

  2. ランク0は、要素/ノードパーティション情報を他のすべてのランクにブロードキャストし、メモリを解放します(メッシュの格納に使用)

  3. すべてのランクは、同じ入力ファイルから所有するノード/要素(ゴーストノードを含む)を読み取ります(注:同じ入力ファイルにアクセスする2000ランクは遅く聞こえるかもしれませんが、実際にはそうではありませんが、ファイルシステムにとっては悪いかもしれませんが、 1回だけ実行しています)。

  4. すべてのランクは、BCの適用とマトリックスの組み立てのためにローカル/グローバルノード/要素/ dofマッピングを作成し、ノードに番号を付け直す必要があります。

すべてのことを言って完了した後、ランク上のすべてのデータはローカルになるため、適切にスケーリングすることができるはずです(メモリに関して)。私はこのすべてを約100行(ここの 35〜132行目を参照)で私の小さなコードで行います。

メッシュが大きすぎて(1億から2億5,000万を超える要素など)、単一ノードでMETISを使用して分割できず、ParMETIS / PT-Scotchが必要な場合は、すべてのコア/ランクはそれを読むことができます。そのようなシナリオでは、ロジスティック上の理由から、パーティション分割フェーズをメインコードから分離する方が簡単な場合があります。

Btw AMRライブラリは通常、テットを実行しません。また、PETScはコードの並列化に適しています。

編集:こちらこちらもご覧ください。


コードを共有していただきありがとうございます!私はあなたが上で概説したルートをたぶん取ります。それは最も複雑ではないようであり、私はすでにそれをどうするかについてのアイデアを持っています。さらに、MPIプログラミングの良い練習になります。あなたは、AMRライブラリは通常テットを処理しないと述べました。それは、三角形メッシュの四分木などの素朴な改良が、品質の悪いメッシュにつながる可能性があるからでしょうか?クワッドの洗練は簡単に思えますが、品質を維持したい場合はテットを4つに分割するのは難しいようです。おそらくPETScのC ++ラッパーはありますか?Cを使用できますが、C ++の方が良いでしょう。
midurad

@midurad CよりもC ++を好む場合は、Trilinosを検討してください。Trilinosは、PETScに匹敵するC ++ライブラリです。さらに、Trilinosには、メッシュパーティショニングの実行に使用できるパッケージ(Zoltan)があります。
Dr_Sam

@midurad PETScを使用する場合、MPI呼び出しはほとんど必要ありません。テットの洗練は簡単なはずですが、関連する動的データ構造を(効率的に)扱うには、いくつかの考えと作業が必要になる場合があります。PETScをC ++で使用できるはずですが、要件を考えるとlibmeshは実行可能なオプションかもしれません(AMRとtetsをサポートしていると思います)。
stali

情報ありがとうございます。それはとても役に立ちました。
midurad

2

私がディールを開発していることを考えると、これは驚くことではないかもしれませんがII。しかし、ここに私の視点があります:学生と話すとき、私は通常、彼らがそれがどのように行われるかを見ることができるように最初に独自のプロトタイプを開発するように伝えます。しかし、その後、彼らは小さな走りを手に入れたら、彼らが基本的にすべてのステップで車輪を再発明する必要がないので、私は彼らにもっと遠くまで行くことができるライブラリを使用させます。

あなたのケースでは、単純なヘルムホルツソルバーの実装方法をすでに見てきました。ただし、これを並行して行うために必要なコードを記述するのに次の6か月を費やし、より複雑なジオメトリを使用する場合はさらに3か月を費やします。効率的なソルバーが必要な場合は、さらに6か月を費やします。そして、この間ずっと、あなたはすでに他の誰かによって書かれたコードを書いており、ある意味では、あなたのPhDのためにあなたが実際に行う必要があることにあなたを近づけません:前にやった。この道を進むと、博士課程の2〜3年を他の人がやり直したことに費やし、おそらく1年は何か新しいことをします。

もう1つの方法は、既存のライブラリの1つを学習するのに6か月を費やすことですが、その後、2〜3年の間、本当に新しいことを行います。彼女の本当に新しいもの、非常に大きなスケールで実行されるもの、または他の点で非常にクールなもの。おそらく、これまでに私がこれからどこへ行くのかお分かりでしょう。


3
あなたは明らかにこれに関する権威だからです。現在の博士課程の学生の誰もがこのような問題に取り組んでいないなら、誰がdeal.iiのような次世代のフレームワークを書くつもりですか?すでにプログラムをコンパイルしたことのない博士課程の新入生の問題のある傾向を見ています。平均的なコード開発スキルが計算科学者の絶え間ない低下にあるように思えるのは、私にとって少し不安です。
アウレリウス

1
公正な質問です。私たちは、おそらく必要があるという理由だけで、私はあったようにあなたは骨の頭と頑固として大学院生が必要:-)しかし、私の答えはそれでいくつか、それを行う人を私たちは奨励すべきであることを意味するものではありません誰を繰り返す自分たちの生活の年を過ごすために他の人がすでに実装しているもの。
ヴォルフガングバンガース

2
ええ、十分に公平です。IMOは、過去20年間CFD研究の世界を妨げてきた唯一の最大の問題は、ソフトウェア工学の才能の欠如と、灰色ひげによる現代のソフトウェア慣行の拒否でした。フレームワークは別として、非常に多くの博士課程の学生は、古いレガシーコードと、現代のハードウェアで現代の数値計算法に必要なソフトウェアの複雑な部分を迅速に構築できないことによって妨げられています。
アウレリウス

私は白ひげについての声明には同意しません(最近は私のものも灰色に変わりつつありますが...)。しかし、彼らはまた、新しい大学院生がいるときに、残酷なレガシーコードか、車輪の再発明のどちらかを選択する必要があることを理解しています。自分が書いたソフトウェアで成功を収めることを楽しむ人はほとんどいません(現在の著者は耐えられません)。
ウォルフガングバンガース

0

これは完全な答えではありません。

並列ドメイン分解メソッドの実装では、いくつかの問題に遭遇しました。まず、1つのサブドメインに多数のプロセッサを使用するか、1つのプロセッサに多数のサブドメインを供給することができ、両方のパラダイムを実装できます。第二に、ドメイン分解法の部分構造化形式では、サブドメイン(要素ではなく)の面、エッジ、頂点を分離する必要があります。これらの複雑さは、並列メッシュ管理に容易に含まれるとは思いません。1つのサブドメインに対して1つのプロセッサを検討し、重複するRAS / RASHOメソッドを使用すると、状況はより単純になります。この場合でも、並列レイアウトを自分で管理した方がよいでしょう。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.