我正在编写一个MPI程序(Visual Studio 2k8 + MSMPI),它使用Boost :: thread为每个MPI进程生成两个线程,并遇到了一个我无法跟踪的问题。
当我使用:mpiexec -n 2 program.exe
运行程序时,其中一个进程突然终止:
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 -----
我不知道为什么第一个进程突然终止,并且无法弄清楚如何追踪原因。即使我在其所有操作结束时将秩为零的过程置于无限循环中,它也会发生......它只是突然死亡。我的主要功能如下:
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);
}
答案 0 :(得分:1)
你必须使用mpi运行时的线程安全版本。
阅读MPI_Init_thread
。