C++ 多线程MPI进程突然终止
我正在编写一个MPI程序(VisualStudio2K8+MSMPI),它使用Boost::thread在每个MPI进程中生成两个线程,并且遇到了一个跟踪困难的问题 当我使用以下命令运行程序时:C++ 多线程MPI进程突然终止,c++,visual-studio-2008,winapi,boost-thread,openmpi,C++,Visual Studio 2008,Winapi,Boost Thread,Openmpi,我正在编写一个MPI程序(VisualStudio2K8+MSMPI),它使用Boost::thread在每个MPI进程中生成两个线程,并且遇到了一个跟踪困难的问题 当我使用以下命令运行程序时:mpiexec-n2 program.exe,其中一个进程突然终止: job aborted: [ranks] message [0] terminated [1] process exited without calling finalize ---- error analysis -----
mpiexec-n2 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);
}
void Master()
{
int-myRank;
国际货币基金组织;
MPI通信大小(MPI通信世界和numProcs);
MPI_Comm_rank(MPI_Comm_WORLD和myRank);
/*创建一条以数字0到39作为有效负载的消息,地址为
*到这根线上去*/
int*有效载荷=新int[40];
对于(int n=0;n<40;n++){
有效载荷[n]=n;
}
如果(myRank==0){
MPI_发送(有效载荷,40,MPI_INT,1,MPI_任意标记,MPI_通信世界);
}否则{
MPI_发送(有效载荷,40,MPI_INT,0,MPI_任意标记,MPI_通信世界);
}
/*释放内存*/
删除(有效载荷);
}
void Slave()
{
MPI_状态;
int*有效载荷=新int[40];
MPI_Recv(有效载荷、40、MPI_INT、MPI_任意源、MPI_任意标记、MPI_通信世界和状态);
/*释放内存*/
删除(有效载荷);
}
您必须使用mpi运行时的线程安全版本。
读取MPI_Init_线程可能是主函数或从函数中的问题。请发布复制问题的函数的最低版本。如果你幸运的话,当你尝试减少问题时,你会发现问题。好的,检查一下。看起来我所在的系统不支持MPI\u线程\u多线程;它只上升到MPI_线程_序列化。我完蛋了吗?粗略猜测,“序列化”意味着只要您使用某种关键节锁来保护MPI调用,这样您就可以保证一次只有一个线程在执行MPI调用了。@HokieTux很难说。在我看来,从相同的mpi级别发送/接收不是一个好的设计,但我不知道您的详细信息。尝试设计您的解决方案,使您不会同时发送和接收威胁信号/共享内存