1

プロデューサーとコンシューマーを使用してサンプルMPIアプリケーションを実装しました。プロデューサーはランク0のプロセスで実行され、コンシューマーはゼロ以外のすべてのランクで実行されます。コンシューマーは、プロデューサーによって生成されたメッセージを処理するためにコンシューマーワーカースレッドを生成します。コンシューマースレッドは、レシーバースレッドとワーカースレッドに分割されます。

コンシューマーレシーバースレッドはrecvを実行し、受信時にコンシューマーワーカーによって消費されるメッセージを渡します。コンシューマーワーカーは、計算を実行した後、処理されたメッセージをProducer(root)に送り返します。

このコードをデュアルコアマシンで実行しています。私が気付いているのは、を使用してアプリケーションを実行するとmpirun -np 2、プロデューサーによって生成された任意の数のメッセージに対してアプリケーションが正常に実行されていることです。を使用してアプリケーションを実行しようとするとmpirun -np 4、2、3回の実行を処理した後、アプリケーションがクラッシュします。

誰かが以前にこの問題に遭遇したことがありますか?なぜこれが起こっているのかについての洞察を得るのは素晴らしいことです。

編集:アプリケーションを実行するたびに発生する例外は次のとおりです。

*** glibc detected *** application: free(): invalid pointer: 0x00007f67d1f9f9e0 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7e626)[0x7f67d0671626]
/usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0x9041)[0x7f67cc790041]
/usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0x5a00)[0x7f67cc78ca00]
/usr/lib/libmpi.so.0(MPI_Recv+0x154)[0x7f67d1d531e4]
/usr/local/lib/libboost_mpi.so.1.50.0(_ZN5boost3mpi6detail19packed_archive_recvEP19ompi_communicator_tiiRNS0_15packed_iarchiveER20ompi_status_public_t+0x33)[0x7f67d1fcb223]
/usr/local/lib/libboost_mpi.so.1.50.0(_ZNK5boost3mpi12communicator4recvINS0_15packed_iarchiveEEENS0_6statusEiiRT_+0x45)[0x7f67d1fc4755]
application(_ZNK5boost3mpi12communicator9recv_implI7MessageEENS0_6statusEiiRT_N4mpl_5bool_ILb0EEE+0x74)[0x464d98]
application(_ZNK5boost3mpi12communicator4recvI7MessageEENS0_6statusEiiRT_+0x3b)[0x46479b]
application(_ZN12WorkerReceiver3runEv+0xac)[0x46b1da]
/usr/local/lib/libPocoFoundation.so.12(_ZN4Poco10ThreadImpl13runnableEntryEPv+0x96)[0x7f67d26fcb16]
/lib/x86_64-linux-gnu/libpthread.so.0(+0x7e9a)[0x7f67d09b7e9a]
/lib/x86_64-linux-gnu/libc.so.6(clone+0x6d)[0x7f67d06e54bd]

ありがとう

4

0 に答える 0