問題タブ [petsc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C と MPI: 関数は同じデータに対して異なる動作をします
PETSc ライブラリを使用して複雑な関数を作成することに成功しました (これは、巨大な線形システムを並列に解くための MPI ベースの科学ライブラリです)。このライブラリは、独自の「malloc」バージョンと基本的なデータ型 (つまり、標準の「int」としての「PetscInt」) を提供します。この関数には、「malloc」や「int」などの標準的なものではなく、常に PETSc のものを使用してきました。この機能は広範囲にテストされ、常に正常に動作しました。MPI を使用しているにもかかわらず、関数は完全にシリアルであり、すべてのプロセッサが同じデータに対して実行します (各プロセッサにはコピーがあります)。通信はまったく関係ありません。
次に、PETSc を使用せず、標準の MPI バージョンを作成することにしました。基本的に、残忍な力ではなく、置換に注意を払って、PETSc のものを古典的な C のものに置き換えるすべてのコードを書き直しました (エディタの「置換」ツールはありません! すべて手作業で行われます)。置換中、a[2] を宣言する代わりに、2 つの異なる変数 a と b を宣言するなど、小さな変更はほとんど行われていません。これらは置換です:
PetscMalloc -> malloc
PetscScalar -> double
PetscInt -> int
PetscBool -> C には boolean データ型がないため、それを複製する列挙型構造を作成しました。
基本的に、アルゴリズムは置換プロセス中に変更されていません。メイン関数は「for」ループです (実際には 4 つのネストされたループ)。各反復で、別の関数を呼び出します。それをディスファンクションと呼びましょう。Disfunction は 4 サイクルの外側では (私が個別にテストしたように) 完全に機能しますが、4 サイクルの内側では機能する場合と機能しない場合があります。また、各反復で Disfunction に渡されるデータをチェックしました。ECXACTELY が同じ入力である場合、Disfunction は反復ごとに異なる計算を実行します。また、 Disfunction はプログラムの異なる実行で常に同じ結果を返すため、計算されたデータは未定義の動作ではないようです。「mpiexec」のプロセッサ数を変更すると、異なる計算結果が得られることに気付きました。
それが私の問題です。その他の考慮事項: プログラムは「malloc」を広範囲に使用します。計算されたデータは、正しいかどうかにかかわらず、すべてのプロセスで同じです。Valgrind はエラーを検出しません (別の問題であり、OT である printf の通常の使用によるエラーの検出は別として)。Disfunction は、他の 2 つの関数を再帰的に呼び出します (PETSc バージョンでも広範囲にテストされています)。関連するアルゴリズムは数学的に正しいです。機能不全は整数パラメータ p>0 に依存します: p=1,2,3,4,5 の場合は完全に機能しますが、p>=6 の場合は機能しません。
質問があれば、コードを投稿できますが、長くて複雑 (科学的に、情報的にではありません) であり、説明するには時間がかかると思います。
私の考えでは、メモリ割り当てを台無しにしているのですが、どこにあるのかわかりません。私の英語と悪い形式で申し訳ありません。
c++ - Clang 3.4 での creal および cimag の問題
Clang 3.4 を使用して Petsc でライブラリをコンパイルしています。
それは、次の定義から導かれます。
私が見つけることができる唯一の関連情報はこれです。これがコンパイラ固有のものであり、いくつかのライブラリが欠落しているか、Petscに問題があるかはわかりません。
小さなテストファイルでそのまま`cimag()'を使ってみたのですが、clang3.4でもgcc4.8でもコンパイルできません。
何が起こっているのか、誰もが何らかの考えを持っています。Google は同様のトピックを表示しません...
編集:
簡単な例を次に示します。
Gcc4.8 (macports から) でコンパイルします。g++-mp-4.8 main.cc -o main
ただし、c11 モードではそうではありません: g++-mp-4.8 -std=c++11 main.cc -o main
:
どちらの場合も、 clangはそれをコンパイルせず、上記と同じエラーを生成します。
c - PetscMalloc vs PetscMallocX
PetscMalloc を 2 回 (X 回) 使用する代わりに、PetscMalloc2 (PetscMallocX) を使用するための経験則は何ですか? チャンクは同様のサイズにする必要がありますか、それともそれらを一緒に/同時に割り当てる方が常に効率的ですか? マニュアルには、定義として「PETSC_MEMALIGN にアラインされた 2 (X) 個のメモリ チャンクを割り当てる」と記載されていますが、PETSc や細かい HPC の問題の初心者である私にとってはあまり意味がありません。私はいつも、コンパイラがそのような問題を処理してくれると思っていました。
gfortran - gfortran で PETSc を使用しましたが、コンパイルされませんでした
Fortran で PESTc をテストして使用したいので、(petscexe.F) のような非常に単純で null のようなものを書きました。
ヘッダー ファイルが正しくインポートできるかどうかを確認します。
ファイルを gfortran でコンパイルします: gfortran petscexe.F -I /opt/local/lib/petsc/include/finclude
ヘッダー ファイルは、コンピューターのこのフォルダー (/opt/local/lib/petsc/include/finclude) にあります。だから、すべてがうまくいくはずですが...
エラーは
このエラーは何ですか? どうもありがとう!
c++ - ユーザー定義マトリックスを PETSc マトリックスに代入
C++ で記述された順次ブロック AIJ マトリックスがあり、PETSc を使用して MPI マトリックスを作成します。そのため、スパース ブロック AIJ 行列を MPI ブロック AIJ PETSc 行列に置き換える必要があります。誰かがそれを行う方法の例を持っていますか? 私がやりたい仕事に関する提案をいただければ幸いです。
c++ - SLEPc を使用してマトリックス エントリに -nan+iG を挿入する
関数 MatSetValues で「-nan+iG の挿入エラー」が発生しました。
私のコードは次のようになります。
最初に以下のコードを使用して double を PETScScalar に変更します (Complex バージョンを使用しています)。
次に、以下のコードを使用して値をマトリックスに挿入します。
問題は次のとおりです。
PETSc コードを .so lib にコンパイルし、プログラムの他の部分とリンクします。
しかし、それは私に言い続けます
行列のエントリ (2,3) に -nan+iG を挿入!
(2,3) は実際にはゼロであり、 std::cerr で印刷でき、ゼロであることがわかります。そこで、マトリックスを画面からファイルにコピーし、オプションを付けてコンパイルします。
g++ test.cpp -L. -leigen_slepc -lstdc++ -I/home/altria/software/slepc-3.4.4/include -I/home/altria/software/slepc-3.4.4/arch-linux2-c-debug/include -I/home/altria /software/petsc-3.4.4/include -I/home/altria/software/petsc-3.4.4/arch-linux2-c-debug/include
今回はパスしました。ということで、コンパイル処理の違いが問題を引き起こしたのかもしれません。誰かが私の問題について何か知っていますか?
c++ - MPI を使用してプロセッサ間でジョブを分散しますが、すべてのプロセッサがジョブの一部ではなくジョブ全体を実行しています。
並列に実行できるが共有メモリ メソッドを使用できる C++ コードがあります。コードを PETSc にリンクすると、PETSc はコードを並列に実行できますが、分散メモリ方式を使用します。コード (PETSc にリンクされた c++) を並行して実行すると、すべてのプロセッサが同じジョブを繰り返しているように見えます。たとえば、プロセッサ数が 4 の場合、境界条件と初期条件が 4 回読み込まれます。または、printf コマンドを使用すると、何かが 4 回出力されます。したがって、ジョブがプロセッサ間で分散されておらず、すべてのプロセッサがジョブの一部ではなくジョブ全体を実行していることを意味します。誰かが同じ経験をしていますか?この問題を解決するためにあなたの提案は何ですか? たとえば、以下のコードでは、メッシュを 1 回ではなく 2 回読み取っていることがわかります。
メッシュ ファイル Mesh_cavity2d.txt の読み取り:
メッシュ ファイル Mesh_cavity2d.txt の読み取り:
また: