タグ付けされた質問 「petsc」

PETScは、偏微分方程式でモデル化された科学アプリケーションのスケーラブル(並列)ソリューションのためのデータ構造とルーチンのオープンソーススイートです。

1
PETScと並行して単純なAx = bシステムを解く
PETScパッケージは初めてです。 マトリックスマーケット形式の〜4000x4000マトリックスAを持っています。複数のプロセッサを使用してこれを解決するためにPETScを取得したいと考えています。 単一のプロセッサでシステムを解く方法は知っていますが、異なるプロセッサ間で行列とベクトルを分散する方法はわかりません。 これを行うための簡単な手順はありますか?
10 petsc  matrix 

3
GPUプログラミングの推力
私はGPGPUプログラミングに非常に慣れていないので、質問が特に適切でない場合はご容赦ください。私が理解していることから、GPUプログラミングは、通常のCPUプログラミングと比較すると、非常に複雑なエンジニアリング作業です。分岐の問題、タイリング、固定されたメモリ割り当て、およびホストとデバイスの通信/デバイスの計算のオーバーラップについては、非常に注意する必要があります。 少し調べたところ、C ++ STLを模倣しようとしているように見えるスラストライブラリが見つかりました。これはかなりいいです。ただし、私の非常に限られた経験と、優れたパフォーマンスを得るために必要なすべてのマイクロ管理を見てきたので、私はパフォーマンスについて少し懐疑的です。推力は、すべての複雑なプログラミング部分を内部で効率的に処理できますか?PETScなどのいくつかの非常に有名なライブラリは、このパッケージを使用しているようです。 低レベルのCUDAプログラミングと比較した場合、CUDAの経験が豊富で推力のある人がパッケージのパフォーマンスについて一言、または二言言うことができるかと思いました。いつ推力を使用できますか?いつCUDAに戻す必要がありますか?


3
「軽量」のFEMパッケージはありますか?
基本的に、FEMはかなり「解決」された問題のようです。Trilinos、PETSc、FEniCS、Libmesh、MOOSEなど、数多くの強力なフレームワークが存在します。 彼らが共通していることの1つは、それらが非常に「重い」ことです。まず、インストールは通常非常に骨の折れる作業です。第二に、それらのインターフェース/ APIは分厚くて重いです-あなたはあなたの考え全体をそれぞれのライブラリの考えに翻訳しなければなりません。これは、特別な要件や既存のコードの相互運用性と拡張性が困難であることも意味します。 (ランダムな例)Boost、LibIGL、Aztec(線形ソルバー)、Eigen、またはCGALなどの他のプロジェクトは、C ++またはPythonコードにシームレスに統合する強力なライブラリーを、非常に無駄のないクリーンなインターフェースで、インストールの必要なしに作成することが絶対に可能であることを示しています超重いフレームワークの。 FEM用の本当に軽量なパッケージはありますか?簡単なオートマジックソルバーを探しているのではありません-無駄のないインターフェース、一般的なデータ構造(たとえばC ++ STLなど)との相互運用性、および軽量のインストール(たとえばヘッダーのみ)を維持しながら強力な機能を提供するライブラリを探しています。

1
Ax = bを解くための行列なしのメソッドの前提条件
Ax = bを解く必要がありますが、それがスパースであっても、問題の行列係数を格納するとメモリが大量に消費されることを理解しています。そこで、同じ係数が行列に多く現れるので、独自のプライベートストレージスキームを使用できるように(そして、キャッシュ効率を向上させることができる)、行列なしの方法の使用を検討しています。 そのような行列のない線形演算子のインターフェイスを提供するpetscを見ていますが、私が実際に理解していないのは、前処理がどのようにpetscによって計算されるかです。それとも、独自のプレコンディショナーを用意する必要がありますか もしそうなら、行列のない線形演算子から前提条件子を構築するために利用可能なツールまたはレシピはありますか? 私の演算子に関する詳細情報:非対称であり、斜めに支配的ではありませんが、いくつかの側波帯が支配的です(ただし、斜めにバンド化されていません)

4
大規模な3次元線形弾性問題のロバストで反復的なソルバーとは何ですか?
私は魅力的な有限要素解析の世界に飛び込んでおり、大きな熱機械的問題(熱機械のみ、フィードバックなし)を解決したいと考えています。→→\rightarrow 機械的な問題については、メッシュのサイズが原因で反復ソルバーを使用する必要があることを、Geoffの回答からすでに把握しました。Mattの返答をさらに読んで、正しい反復アルゴリズムの選択は困難な作業であると述べました。 最高のパフォーマンスの検索を絞り込むのに役立つ大きな3次元線形弾性問題の経験があるかどうかをここで尋ねていますか?私の場合、それは薄いパターン化されたフィルムと不規則に配置された材料(高CTEと低CTEの両方)の構造です。この熱機械分析では大きな変形はありません。大学のHPC [1.314ノード、2つのAMD Opteronプロセッサ(各2.2 GHz / 8コア)を使用]を使用できます。 私はPETSc興味深いもの、特にある種のドメイン分解(FETI、マルチグリッド)を行うアルゴリズムを含むことができると思いますが、オプションに少し圧倒され、経験がありません。「幾何学的な情報に基づいたプレコンディショナー」というフレーズも好きですが、これが役立つかどうかはわかりません。線形連続体力学に焦点を当てたものはまだ見つけていません。 強力なスケーリング(アムダール)は私のアプリケーションで非常に重要です。なぜなら、私の産業パートナーはシミュレーション結果を長時間待つことができないからです。私は間違いなく回答だけでなく、コメントでさらに読むための推奨事項にも感謝しています。

1
SLEPcを使用した線形安定性解析から大規模な非エルミート一般化固有値問題を解く
一般化された行列問題があります。線形安定性解析問題のスペクトル法からのです。私の行列Bは対角で正の半定値です。Aは非エルミートで複雑です。Ax=λBxAx=λBxA x = \lambda B x 私の問題は、SLEPcの一般化された固有値ソルバーを使用すると、「LU分解のピボットがゼロ」というエラーが発生することです。以下の残りの部分は、問題の詳細とこれまでに試したものです。助けてくれてありがとう! 問題の詳細 行列は最大で約48000 x 48000になり、固有値を見つけたいと思います。私が興味を持っている固有値は、0 + 0iの近くに実数部が最も大きいものです。理想的には、それらが内部にある場合(つまり、スペクトル内の正の実部がより大きい他の固有値がある場合)でもそれらを見つけられるようにしたいです。ただし、すべての固有値が対象の固有値以外の実部<0である問題に対して機能させることができれば幸いです。 現時点では、scipy linalg.eigおよびsparse.eigs関数を使用しています。私の知る限り、これらはそれぞれLAPACKとARPACKを使用して重い作業を行います。私は、SLEPcライブラリを使用することで、より良いパフォーマンスを達成できるかどうかを確認することにしました。これが悪い決定であるならば、私に知らせてください! SLEPc固有値ソルバーでPETScを使用したいと思います。私は、チュートリアルの一部として提供されている例を使用してSLEPcを試しました。演習7(http://www.grycap.upv.es/slepc/handson/handson3.html)は、ファイルから行列AおよびBを読み取り、解を出力します。提供されたマトリックスを使用してこれを正常に動作させました。ただし、問題の小さいサイズのテストバージョン(6000x6000)に置き換えると、指定したコマンドライン引数に応じてさまざまなエラーが発生します。 私が抱えている主な問題は、「LU分解のピボットがゼロ」というエラーです。デフォルト設定を使用する場合。 これは、Bにゼロの行が含まれているという事実に関連していると思いますが、線形代数の私の理解はやや基本的です。これは本当ですか? petscのWebサイトで提案されているオプション、-pc_factor_shift_type NONZEROなどを設定しようとしましたが、これらのオプションが使用されなかったという追加の警告が表示されます これは前提条件の問題であると想定したので、-eps_targetを0.1に設定し、-st_type sinvertとshiftを指定した場合と指定しない場合の両方を試しました。それでも同じエラーが発生します。 次に、-st_pc_type jacobiとst_pc_type bjacobiを試しました。jacobiは実行されますが、固有値は生成されません。ブロックjacobiはLU分解を実行し、同じエラーを再度表示します。 デフォルトの方法はkrylov-schurなので、-eps_type gdおよび-eps_type jdオプションを使用して実験しました。残念ながら、これらはナンセンス固有値を生成するようですが、scipyでLAPACKを使用して解決すると、スペクトルにまったく表示されません。 私の行列の問題は特異ではないことを知っています。なぜなら、私はscipyを使用してそれを解くことができるからです。 これらすべての異なるソルバーの動作を理解するために、PETSCとSLEPCのマニュアル以外に読む必要がある本/ガイドを知っていますか? コマンドラインオプションがない場合の出力を以下に示します。 私の最初の投稿を読んでいただきありがとうございます。 よろしく、トビー SLEPcからのターミナル出力 tobymac:SLEPC toby $ mpiexec ./ex7 -f1 LHS-N7-M40-Re0.0-b0.1-Wi5.0-amp0.02.petsc -f2 RHS-N7-M40-Re0.0-b0.1- Wi5.0-amp0.02.petsc -eps_view ファイルに保存されている一般化された固有問題。 [0] PETSC ERROR:---------------------エラーメッセージ--------------------- --------------- …

1
対流拡散演算子の前処理に代数マルチグリッドを使用する
線形連立方程式を解くために、FEM離散化とPETScに基づいてNavier Stokesを実装しました。効率的な解の手順を作成するために、私は「非圧縮性流れのための線形化されたナビエ・ストークス方程式の効率的な事前調整」(Silvester et al。)に従って、Schur補完アプローチを提案します。メッシュサイズとタイムステップに関係なく、ほぼ一定の反復回数があり、このホワイトペーパーでも説明されている単純なベンチマーク(2D駆動キャビティフローと後向きステップ)の反復数がほぼ一定であるという意味で、これは非常にうまく機能します。しかし、現時点では、並列速度直接ソルバー(MUMPS)で上部速度ブロックを解きます。Pressure Schurブロックは、論文で提案されているように、不正確なソルバーで解かれます。 この論文では、著者は、各外部反復で単一のマルチグリッドVサイクルを実行し、この離散対流拡散演算子の逆数を近似するためにポイントガウスザイデルスムーザーを使用することを提案しています。幾何学的なマルチグリッド法を簡単に使用できないため、直接ソルバーを1つの代数的マルチグリッドVサイクル(hypreパッケージのboomeramg)に置き換えることを考えました。しかし、メッシュを細かくしている間、一定数の反復を失うよりも。 代数的マルチグリッドに基づいて速度行列の逆行列に対してスペクトル的に等価で効率的な前処理を作成する方法を知っている人はいますか?この場合、代数的マルチグリッドを利用できない固有のものはありますか?そうでない場合、定数反復スケーリングを失う原因は何でしょうか? 編集: 速度ブロックのさまざまなソルバーのベンチマークをいくつか追加しました。問題は、標準の2D駆動キャビティフロー、テイラーフードによる離散化、およびユニットボックスの均一な改良によって解決されます。 Exaktソルバー(MUMPS) :25 ITER H=1h = 132h=132h = \frac{1}{32}:25 ITER H=1h = 164h=164h = \frac{1}{64}:25反復 h=1h = 1128h=1128h = \frac{1}{128}:22反復h = 1256h=1256h = \frac{1}{256} 1つのV-AMG(代数、ブーメラム) :30 ITER H=1h = 132h=132h = \frac{1}{32}:30 ITER H=1h = 164h=164h = \frac{1}{64}:39反復 h=1h = 1128h=1128h = …

1
疎な複雑な行列をコードからPETScに効率的に取得する方法
FortranコードからPETScに複雑なスパース行列を取得する最も効率的な方法は何ですか?これは問題に依存することを理解しているので、以下に関連する詳細をできるだけ多く記載するようにしました。 私は一緒に遊んでてきたFEAST固有値ソルバー[1]タイプの問題のためのの次元は行列AとBがあるN、およびほとんどすべての時間が解決費やされているN × N複素線形をM0右側のシステム。Nは大きく(3DでのFE基底関数の数)、M0は小さい(私の場合はM0〜20に興味がある)。行列AとBは実対称でスパースであり、解を必要とする複雑な問題はz A − Bであり、ここでzA X = λ B Xあバツ=λBバツA x = \lambda B xああABBBNNNN× NN×NN \times NああABBBzA − Bzあ−BzA-Bzzzは複素数です。FEASTの作成者は、この正確な固有値と固有ベクトルを取得するために、この線形システムの解の精度をそれほど高くする必要がないことを示唆しているようです。そのため、いくつかの高速反復ソルバーは、これに対する優れたソリューションとなる可能性があります。 これまでのところ、複雑なシステムにLapackを使用してきましたが、これは私のコンピューターでにうまく機能します。Nが大きい場合、最適なソルバーがまだわからないので、PETScを使用して、そこで反復ソルバーを試してみたかったのです。N&lt; 1500N&lt;1500N < 1500NNN 私は単純なCドライバーを作成し、それをFortranから呼び出しました。すべてのコードについては[2]を参照してください。問題はこの部分にあります(更新:マトリックスを作成するためにすべての行をここに配置しました。これが関連していること): ierr = MatCreate(PETSC_COMM_WORLD,&amp;A);CHKERRQ(ierr); ierr = MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n);CHKERRQ(ierr); ierr = MatSetFromOptions(A);CHKERRQ(ierr); ierr = MatSetOption(A,MAT_IGNORE_ZERO_ENTRIES,PETSC_TRUE);CHKERRQ(ierr); ierr = MatSetUp(A);CHKERRQ(ierr); for (i=0; i&lt;n; i++) col[i] = i; ierr …

1
線形システムのスパースパターンは、反復(KSP)ソルバーにとって重要ですか?
ほとんど問題です。一般的な疎で非対称な(数値的および構造的の両方の)行列を考えると、反復ソルバーのスパースパターン(つまり、行列/ベクトルの行/列の置換)はどのくらい重要ですか?フィルインの数に直接影響を与えることにより、直接ソルバー(LU)またはプレコンディショナー(ILU)にとって重要になることがわかります。 ただし、反復ソルバーの場合、最も重要な部分は、実際の行列パターンを気にしないように見えるMatVec操作であるようです。ここで考慮していないパターンに依存する可能性のあるコンポーネントはありますか? 並行してどうですか?マトリックスとベクトルの分布の仕方でパターンが重要になり、通信量/オーバーヘッドを決定するかもしれないが、他の考えや入力を見たいと思います。 私はこれを一般的に、そしてPETScのKSPソルバーに関しても尋ねています。

2
シーケンシャルコードが使用できない場合、単一のプロセッサで実行される並列コードの並列オーバーヘッドをどのように計算しますか?
PETScの線形ソルバーのパフォーマンスをプロファイルしています。私が理解しているように、 スピードアップ= シーケンシャルタイム並列時間。スピードアップ=順次時間並列時間。\text{speedup}=\frac{\text{Sequential Time}}{\text{Parallel Time}}. 1つのプロセッサで並列コードを実行すると、シーケンシャルパフォーマンスのプロキシとして使用できることを知っています。ただし、並列オーバーヘッドが発生するため、これは同等の順次コードの適切な尺度ではないと思います。多くの場合、シーケンシャルコードのパフォーマンスは、シングルプロセッサのパラレルパフォーマンスよりも高速です。同じソルバーを実装する数値ライブラリを検索できると思いますが、アルゴリズムが実際に同等である保証はありません。 私が理解しているように、 1つのプロセッサーでの並列パフォーマンス= 順次時間+ 並列オーバーヘッド1つのプロセッサーでの並列パフォーマンス=順次時間+パラレルオーバーヘッド\text{Parallel performance on one processor} = \text{Sequential Time} + \text{Parallel Overhead} したがって、並列オーバーヘッドを定量化する方法がある場合は、1つのプロセッサーの並列時間からそれを差し引いて、順次時間のより良い測定値を取得できます。 したがって、私の質問は次のようになります。 シーケンシャルコードが利用できない場合に、単一のプロセッサで実行される並列コードの並列オーバーヘッドを計算する方法はありますか? 本当に必要ですか?一般に、1つのプロセッサでの並列パフォーマンスは、順次パフォーマンスを概算するのに十分ですか?

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