C++ 多线程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 -----

我正在编写一个MPI程序(VisualStudio2K8+MSMPI),它使用Boost::thread在每个MPI进程中生成两个线程,并且遇到了一个跟踪困难的问题

当我使用以下命令运行程序时:
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级别发送/接收不是一个好的设计,但我不知道您的详细信息。尝试设计您的解决方案,使您不会同时发送和接收威胁信号/共享内存