問題タブ [scalapack]
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.
mpi - scalapack PDGESV を使用して線形方程式の大規模システムを解く際のセグメンテーション違反
scalapack ルーチン PDGESV を使用して一連の線形連立方程式 Ax = b を解く並列 fortran コードは、no. 式の N が大きくなります。問題が発生する N の正確な値は特定していませんが、たとえば、N= 50000 までテストしたすべての値に対してコードは完全に機能しますが、N=94423 で失敗します。
特に、scalapack PDGESV ルーチンの呼び出し中に障害が発生します (つまり、メモリの割り当て/割り当て解除時ではありません)。ルーチン PDGESV に入りますが、このルーチンを離れません。
Intel(R) Xeon(R) CPU E5-1660 v4 @ 3.20GHz プロセッサを使用して、148 GB メモリの Linux Mint 18.3 Sylvia システムで作業しています。gfortranを採用したmpifortranを使用しています。
コードは N のすべての値と N=50000 まで試したプロセス構成で完全に機能し、エラーがないことを示す INFO=0 コードで終了するため、Fortran コード自体に問題はないと確信しています。発生した。(また、解行列 x* の残差を明示的にチェックするプログラムのわずかに変更されたバージョンを実行しました。つまり、Ax* - b を計算し、ゼロに近い最大絶対値を正確に見つけました)。行列が特異であることに何らかの問題があった場合は、もちろん代わりにゼロ以外の INFO コードで PDGESV ルーチンからの終了を観察します。
マシンのメモリも十分にあるようです。問題のケース N=94423 では、利用可能な 148 GB のメモリに対して 65 GB のメモリしか必要とせず、割り当て時に問題はありません (さらに、同じ問題を解決し、65 GB のメモリを使用するシリアル コードはエラーなしで実行されます)。
代わりに、mpi の単一プロセスで使用できるメモリのデフォルト制限を超える可能性があるという問題があると思いますか? つまり、コンパイル/実行時に適切な FLAGS が欠落している可能性がありますか?
「ulimit -s unlimited」コマンドを使用してみましたが、問題は解決しませんでした。
以下の Fortran コードをコピーします。これは単純なテスト プログラムで、1) 行列 A とベクトル b にスペースを割り当て、2) それらのエントリをランダムなエントリで埋め、3) PDGESV を呼び出し、4) メモリの割り当てを解除します。
以下に、使用したコンパイル/実行コマンド (mpifortran/ gfortran を使用) を示します。
注: PGI fortran コンパイラも使用してみましたが、同じテスト ケースで同じエラーが発生しました (以下のエラー出力を参照)。
Fortran コード:
上記のコードを mpifort -Wall -mcmodel=medium -static-libgfortran -m64 /opt/openblas/lib/libopenblas.a /usr/local/lib/libscalapack.a /opt/openblas/lib/libopenblas.a でコンパイルします。 -lm -lpthread -lgfortran -lm -lpthread -lgfortran -o para.exe solve_by_lu_parallellmpi_simple_light.for /opt/openblas/lib/libopenblas.a /usr/local/lib/libscalapack.a /opt/openblas/lib/libopenblas.a -lm -lpthread -lgfortran -lm -lpthread -lgfortran
これはエラーや警告を生成せず、次のように実行します (例):
mpirun -n 4 ./para.exe 944 2 2 32 > DUMP05
ここでは、ブロック サイズ 32 の 2x2 BLACS プロセス アレイを使用して、944 eqns のシステムを解きます。
この小さな N ケースでは、(実行が成功した) 出力が得られます。
944 の線形方程式系を解いています
PROC: 0 0 には MLOC があり、NLOC = 480 480
PROC: 0 0 スペースを割り当てています ...
PROC: 1 0 HAS MLOC、NLOC = 464 480
PROC: 1 0 スペースを割り当てています ...
PROC: 0 0 行列 A と RHS ベクトル B を構築中 ...
PROC: 1 0 行列 A と RHS ベクトル B を構築中 ...
PROC: 1 1 には MLOC があり、NLOC = 464 464
PROC: 1 1 スペースを割り当てています ...
PROC: 1 1 行列 A と RHS ベクトル B を構築中 ...
PROC: 0 1 には MLOC があり、NLOC = 480 464
PROC: 0 1 スペースを割り当てています ...
PROC: 0 1 行列 A と RHS ベクトル B を構築中 ...
PROC: 0 0 NOW SCALAPACK PDGESV を使用してシステム AX = B を解決
.. PROC: 1 0 NOW SCALAPACK PDGESV を使用してシステム AX = B を解く
.. PROC: 1 1 現在、SCALAPACK PDGESV を使用してシステム AX = B を解いています
.. PROC: 0 1 現在、SCALAPACK PDGESV を使用してシステム AX = B を解いています
..
PDGESV = 0 によって返される INFO コード
ここまでは順調ですね。ただし、代わりに次のように実行します。
mpirun -n 4 ./para.exe 94423 2 2 32 > DUMP06
次のエラーが発生します (このような実行には 65 GB のメモリが必要で、私のマシンでは約 45 分かかることに注意してください)。
プログラムが信号 SIGSEGV を受信しました: セグメンテーション違反 - 無効なメモリ参照。
プログラムが信号 SIGSEGV を受信しました: セグメンテーション違反 - 無効なメモリ参照。
プログラムが信号 SIGSEGV を受信しました: セグメンテーション違反 - 無効なメモリ参照。
プログラムが信号 SIGSEGV を受信しました: セグメンテーション違反 - 無効なメモリ参照。
プログラムが信号 SIGSEGV を受信しました: セグメンテーション違反 - 無効なメモリ参照。
プログラムが信号 SIGSEGV を受信しました: セグメンテーション違反 - 無効なメモリ参照。
プログラムが信号 SIGSEGV を受信しました: セグメンテーション違反 - 無効なメモリ参照。
プログラムが信号 SIGSEGV を受信しました: セグメンテーション違反 - 無効なメモリ参照。
このエラーのバックトレース:
このエラーのバックトレース:
このエラーのバックトレース:
このエラーのバックトレース:
このエラーのバックトレース:
このエラーのバックトレース:
このエラーのバックトレース:
このエラーのバックトレース:
何らかの理由でバックトレース情報が出力されませんが、同じコードを PGI fortran コンパイラ (Red Hat Linux 7.3 を実行している別のマシン上) で実行すると、次の出力で失敗します。
[sca1993:113193] * 受信信号の処理 *
[sca1993:113193] シグナル: セグメンテーション違反 (11)
[sca1993:113193] 信号コード: アドレスがマップされていません (1)
[sca1993:113193] アドレスで失敗: 0x2b8c5a036390
[sca1993:113193] [0] /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libpthread.so.0(+0xf5d0)[0x2b900528c5d0 ]
[sca1993:113193] [1] /usr/local/pgi/linux86-64/17.7/lib/libblas.so.0(+0x280c950)[0x2b9003acc950]
[sca1993:113193] [2] /usr/local/pgi/linux86-64/17.7/lib/libblas.so.0(daxpy_k_HASWELL+0x7f)[0x2b9003acc54f]
[sca1993:113193] [3] /usr/local/pgi/linux86-64/17.7/lib/libblas.so.0(dger_k_HASWELL+0xd5)[0x2b9003ad6635]
[sca1993:113193] [4] /usr/local/pgi/linux86-64/17.7/lib/libblas.so.0(dger_+0x21f)[0x2b90013d9f5f]
[sca1993:113193] [5] ./para_try.exe[0x446e70]
[sca1993:113193] [6] ./para_try.exe[0x41b4ad]
[sca1993:113193] [7] ./para_try.exe[0x4071e1]
[sca1993:113193] [8] ./para_try.exe[0x406b39]
[sca1993:113193] [9] ./para_try.exe[0x404ba6]
[sca1993:113193] [10] ./para_try.exe[0x403654]
[sca1993:113193] [11] /usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libc.so.6(__libc_start_main+0xf5)[ 0x2b9005cb83d5]
[sca1993:113193] [12] ./para_try.exe[0x403549]
[sca1993:113193] * エラーメッセージの終わり *
誰か提案があれば、私はとても感謝しています。どうもありがとう、ダン。
fortran - BLACS ライブラリをコンパイルするための makefile ファイルのカスタマイズ方法
Fortran でコードをコンパイルするための makefile ファイルがあります。この makefile は既に Lapack ライブラリもコンパイルしています。システムに BLACS ライブラリが既にインストールされていることを考慮して、BLACS ライブラリもコンパイルするためにこの makefile を変更する方法を教えてください。
私のメイクファイル:
fortran - scalapack での一貫性のない行割り当て
次の単純な fortran プログラムを考えてみましょう
11 mpi ランクで実行すると、
これは、scalapackがこの配列を分割することを期待する方法ですが、ランクの数が偶数の場合は次のようになります。
これは意味がありません。ブロック サイズ 100 でランク 0 が 200 要素を取得し、ランク * ブロック サイズ > N になるのはなぜですか。このため、私のプログラムは mpi ランク 1、2、3、5、7、11 では機能しますが、ランク 4 では失敗します。 、6、8、9、10、12など(ランク9で失敗する理由はわかりません!)。私のアプローチで何が間違っているのか誰かが説明できますか?
GFortran バージョン: 6.1.0
SCALPACK バージョン: 2.1.0
macOS バージョン: 10.11