マルチスレッドアプリケーションでMPIを使用しようとしています。メインスレッドでは、MPI環境を初期化してManagerオブジェクトを作成します。 Managerオブジェクトは、オブジェクトを受け取るためのスレッドとGUIスレッドの2つの追加スレッドを開始します。ユーザーが送信ボタンをクリックするたびに、オブジェクトは対応するランクに送信されるはずです。時にはTHS操作は成功しますが、私はこのエラーを取得するときの状況がありますマルチスレッドアプリケーションでMPIを使用する
Unhandled Exception: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at MPI.Unsafe.MPI_Recv(IntPtr buf, Int32 count, Int32 datatype, Int32 source, Int32 tag, Int32 comm, MPI_Status& status)
at MPI.Communicator.Receive[T](Int32 source, Int32 tag, T& value, CompletedStatus& status)
at MPI.Communicator.Receive[T](Int32 source, Int32 tag, T& value)
at MPI.Communicator.Receive[T](Int32 source, Int32 tag)
コード:
public Manager(String managerID)
{
//other actions...
(new Thread(new ThreadStart(startGUIThread))).Start();
ReceiverThread = new Thread(new ThreadStart(MachineReceiver));
ReceiverThread.Start();
}
public void MachineReceiver()
{
while (IsRunning)
{
System.Console.Out.WriteLine("initiated");
Data data = Communicator.world.Receive<Data>(source, 100);
System.Console.Out.Write("Received");
}
}
私は今、二週間のためにこれを修正しようとしてきたので、任意の助けが理解されます。
を参照してください。新しい行が続く各行の最後に2つのスペースを入れてください。あなたのエラーメッセージは、より読みやすくなります –
追加のコード、特にMPI関連の呼び出しを行う場所を追加してください。 また、これを 'gdb'(またはこれに類する)で実行しようとしましたか? –
MPI実装でサポートされているスレッディングのレベルはどれですか?低レベルの 'MPI_Thread_init'はレベルを返し、' MPI_Query_thread'も使用できます。入手方法については、MPIラッパーのドキュメントを参照してください。提供されたレベルが 'MPI_THREAD_MULTIPLE'または' MPI_THREAD_SERIALIZED'でない場合、あなたは** MPI呼び出しを、 'MPI_Init_thread'を呼び出したものとは異なるスレッドから行うべきではありません。 –