3

mpi プログラムで割り当てられたメモリを解放する際に奇妙な問題があります。

これは私のためにエラーを生成するコードサンプルです:

void *out, *in;
int cnt = 2501; //if cnt<=2500: works perfectly. cnt>2500: crashes at free!

if((out = malloc(cnt * sizeof(double))) == NULL) 
    MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OP);
if((in = malloc(cnt * sizeof(double))) == NULL) 
    MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OP);

//Test data generation
//usage of MPI_Send and MPI_Reduce_local
//doing a lot of memcpy, assigning pointer synonyms to in and out, changing data to in and out

free(in);    //crashes here with "munmap_chunk(): invalid pointer" 
free(out);   //and here (if above line is commented out) with "double free or corruption (!prev)"

valgrind を使用して実行しました。

 mpirun -np 2 valgrind  --leak-check=full --show-reachable=yes  ./foo

そして以下を得ました:

==6248== Warning: ignored attempt to set SIGRT32 handler in sigaction();
==6248==          the SIGRT32 signal is used internally by Valgrind
cr_libinit.c:183 cri_init: sigaction() failed: Invalid argument

==6248== HEAP SUMMARY:
==6248==     in use at exit: 0 bytes in 0 blocks
==6248==   total heap usage: 1 allocs, 1 frees, 25 bytes allocated
==6248== 
==6248== All heap blocks were freed -- no leaks are possible
==6248== 
=====================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   EXIT CODE: 134

このエラーを追跡する方法についてのアイデアはありますか? cnt>2500 の場合にのみ表示されることに注意してください。

4

2 に答える 2

3

GNU glibc を使用している場合は、プログラムを実行する前に環境変数 MALLOC_CHECK_ を 2 に設定して、メモリ割り当て呼び出しの追加チェックを有効にすることができます — 詳細はこちら.

于 2012-05-17T09:58:45.217 に答える
1

あなたが上に持っていたメッセージ、

警告: sigaction() で SIGRT32 ハンドラを設定しようとしても無視されました。SIGRT32 シグナルは Valgrind によって内部的に使用されます cr_libinit.c:XXX cri_init: sigaction() が失敗しました: 引数が無効です

MPI (私の場合は mpich-3.1.4-9) の BLCR チェックポインティング ライブラリ (私の場合は blcr-0.8.5) の使用に関係しています。

BLCR をサポートしていなかったとき ("mpiexec -info" を実行し、"Checkpointing libraries available" の行を確認)、Valgrind はテスト段階で完全に機能していました。

BLCR サポート (チェックポイント実験用) のために MPI を再コンパイルしたとき、Valgrind が心臓発作を起こしました。彼は完全に仕事をやめました。

バグ (プログラマーが言うように) は非常に悪いものです。なぜなら、明らかに 2 つのプログラムが、実行中のプログラムへの割り込みに同じ信号を使用しているからです。(私たちの場合、MPI の BLCR が最初にそれを取得し、現在は Valgrind が空中を歩いています)。

同じマシンで MPI の 2 つの異なるインストール (blcr をサポートするものとサポートしないもの) を実行してみます。

アップデート:

Checkpoint 自体が動作していたとしても、mpiexec 並列実行可能ファイル (以前に動作していたプログラム) を実行することはできませんでした。Mpiexec コマンド自体は、チェックポイント ライブラリ BLCR を使用 (コンパイル済み) しているときにクラッシュしていました。

解決:

BLCRをサポートせずにMPI(mpich-3.1.4-9)を再コンパイル (BLCR を完全に公開しました)、DMTCPチェックポイントソリューション(dmtcp-2.4.4)をインストールしました。これは透過的に機能するだけでなく、BLCRよりも高速です(参考文献にベンチマークがあります)。

これで、すべてが意図したとおりに実行されます:)、チェックポイントが設定されたジョブの処理も適切に行われます。将来的には、DMTCP のより重いテストを行う予定です (並列プログラムからの重い/アクティブな IO を持つローカル ファイルを使用します)。

PS。また、mpich がディストリビューション (2016 年 7 月) から BLCR を完全に公開していることもわかりました。

于 2016-06-05T15:21:22.747 に答える