【问题标题】:Multi-Threaded MPI Process Suddenly Terminating多线程 MPI 进程突然终止
【发布时间】:2010-03-09 21:41:54
【问题描述】:

我正在编写一个 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;
}

masterslave 函数在结束前做了一些任意的工作。我可以确认主线程至少已经到了其操作的终点。从线程始终是在执行中止之前未完成的线程。使用 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);
}

【问题讨论】:

  • 可能是主功能或从功能的问题。请发布复制问题的那些函数的minimal 版本。如果幸运的话,当您尝试减少问题时,您会发现问题。

标签: c++ visual-studio-2008 winapi boost-thread openmpi


【解决方案1】:

您必须使用 mpi 运行时的线程安全版本。 阅读MPI_Init_thread

【讨论】:

  • 好的,检查了。看来我使用的系统不支持 MPI_THREAD_MULTIPLE;它只上升到 MPI_THREAD_SERIALIZED。我搞砸了吗?
  • 作为一个粗略的猜测,“序列化”意味着只要你用某种临界区锁保护你的 MPI 调用就可以了,这样你就可以保证只有一个线程在执行一次 MPI 调用。
  • @HokieTux 很难说。在我看来,从相同的 mpi 等级发送/接收不是一个好的设计,但我不知道你的详细信息。尝试设计您的解决方案,以便您不会同时发送和接收,可能使用威胁信号/共享内存
猜你喜欢
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多