Boost::thread を使用して MPI プロセスごとに 2 つのスレッドを生成する MPI プログラム (Visual Studio 2k8 + MSMPI) を作成していますが、追跡に問題があるという問題が発生しました。
でプログラムを実行すると: mpiexec -n 2 program.exe
、プロセスの1つが突然終了します:
job aborted:
[ranks] message
[0] terminated
[1] process exited without calling finalize
---- error analysis -----
[1] on winblows
program.exe ended prematurely and may have crashed. exit code 0xc0000005
---- error analysis -----
最初のプロセスが突然終了する理由がわかりません。理由を突き止める方法もわかりません。これは、すべての操作の最後にランク 0 のプロセスを無限ループに入れた場合でも発生します... 突然停止します。私の主な機能は次のようになります。
int _tmain(int argc, _TCHAR* argv[])
{
/* Initialize the MPI execution environment. */
MPI_Init(0, NULL);
/* Create the worker threads. */
boost::thread masterThread(&Master);
boost::thread slaveThread(&Slave);
/* Wait for the local test thread to end. */
masterThread.join();
slaveThread.join();
/* Shutdown. */
MPI_Finalize();
return 0;
}
master
関数とslave
関数が終了する前に任意の作業を行う場所。少なくとも、マスター スレッドがその操作の最後に達していることを確認できます。スレーブ スレッドは常に、実行が中止される前に完了していないスレッドです。print ステートメントを使用すると、スレーブ スレッドで実際にエラーが発生していないように見えます... 順調に進んでいて、クラッシュに巻き込まれただけです。
それで、誰かが次のことについて何か考えを持ってい
ますか? a) 何が原因でしょうか?
b) どのようにデバッグすればよいですか?
本当にありがとう!
編集:
マスター/スレーブ機能の最小限のバージョンを投稿します。このプログラムの目的は純粋にデモンストレーションを目的としていることに注意してください...そのため、何も役に立ちません。基本的に、マスター スレッドはダミー ペイロードを他の MPI プロセスのスレーブ スレッドに送信します。
void Master()
{
int myRank;
int numProcs;
MPI_Comm_size(MPI_COMM_WORLD, &numProcs);
MPI_Comm_rank(MPI_COMM_WORLD, &myRank);
/* Create a message with numbers 0 through 39 as the payload, addressed
* to this thread. */
int *payload= new int[40];
for(int n = 0; n < 40; n++) {
payload[n] = n;
}
if(myRank == 0) {
MPI_Send(payload, 40, MPI_INT, 1, MPI_ANY_TAG, MPI_COMM_WORLD);
} else {
MPI_Send(payload, 40, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD);
}
/* Free memory. */
delete(payload);
}
void Slave()
{
MPI_Status status;
int *payload= new int[40];
MPI_Recv(payload, 40, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
/* Free memory. */
delete(payload);
}