【问题标题】:What do these exit code mean for a MPI program?这些退出代码对 MPI 程序意味着什么?
【发布时间】:2016-01-14 10:21:38
【问题描述】:

当我尝试运行 MPI 程序但失败时。它说:

job aborted:

[ranks] message

[0] process exited without calling finalize

[1-3] terminated

错误分析说退出代码是0xc0000005。

然后我用谷歌搜索,有人说改用MPI_Init_thread,但它给了我255作为退出代码。

我该如何解决? rank 0 进程有什么问题?

下面是使用 MPI 发送和接收数据的代码片段:

        // MPI things
    MPI_Comm_rank(MPI_COMM_WORLD, &taskid);
    // master
    if (taskid == 0)
    {
        //printf("taskid: %d", taskid);
        average = Nchunk / Nworkers;
        extra = Nchunk % Nworkers;
        mtype = FROM_MASTER;
        offset = 0;

        // store volume[Itemp[n]]
        for (int i = 0; i < Nchunk; i++)
        {
            volumeTemp[i] = volume[Itemp[i]];
        }

        // send to slave
        for (int dest = 1; dest <= Nworkers; dest++)
        {

            Nelements = (dest <= extra) ? average + 1 : average;
            MPI_Send(&Nelements, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
            MPI_Send(&offset, 1, MPI_INT, dest, mtype, MPI_COMM_WORLD);
            MPI_Send(&Itemp[offset], Nelements, MPI_INT, dest, mtype, MPI_COMM_WORLD);
            MPI_Send(&SMtemp[offset], Nelements, MPI_FLOAT, dest, mtype, MPI_COMM_WORLD);
            MPI_Send(&volumeTemp[offset], Nelements, MPI_FLOAT, dest, mtype, MPI_COMM_WORLD);
            offset = offset + Nelements;
        }


        // receive result from slave
        mtype = FROM_WORKERS;
        for (int source = 1; source <= Nworkers; source++)
        {
            //MPI_Recv(&average, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
            //MPI_Recv(&offset, 1, MPI_INT, source, mtype, MPI_COMM_WORLD, &status);
            MPI_Recv(&sinogram[ns], 1, MPI_FLOAT, source, mtype, MPI_COMM_WORLD, &status);
        }


    }
    //printf("taskid: %d", taskid);

    // slave
    if (taskid > 0)
    {
        //printf("taskid: %d", taskid);
        mtype = FROM_MASTER;
        MPI_Recv(&Nelements, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
        MPI_Recv(&offset, 1, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
        MPI_Recv(&Itemp[offset], Nelements, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
        MPI_Recv(&SMtemp[offset], Nelements, MPI_INT, MASTER, mtype, MPI_COMM_WORLD, &status);
        MPI_Recv(&volumeTemp, Nelements, MPI_FLOAT, MASTER, mtype, MPI_COMM_WORLD, &status);

        for (int i = 0; i < average; i++)
        {
            if (fabs(volumeTemp[i]) > 1.0e-14)
                sinogram[ns] = sinogram[ns] + volumeTemp[i] * SMtemp[i];
        }

        //send to master
        mtype = FROM_WORKERS;
        MPI_Send(&sinogram[ns], 1, MPI_FLOAT, MASTER, mtype, MPI_COMM_WORLD, &status);
    }

【问题讨论】:

  • 显示代码,可以是任何东西。尝试找出进程在代码中的退出位置。
  • 应该是MCVE...
  • 对不起,这是我第一次发布我的问题。我附上了一个代码片段以使其更好

标签: mpi


【解决方案1】:

MPI 的退出代码几乎没有任何意义,因为您有多个进程都返回自己的错误代码。依靠程序吐出的错误消息会更有帮助。幸运的是,你的程序做到了!

[0] process exited without calling finalize

这可能意味着两件事之一;

  1. 您的程序已完成,但没有调用MPI_Finalize。这是一个很容易解决的问题。检查以确保您的程序在任何可以正常终止的地方都调用MPI_Finalize。不过,这可能是也可能不是您的问题...
  2. 您的程序异常终止。这通常更难追踪,并且可能需要一些常用的MPI debugging 技巧。如果这是问题所在,我们可能无法在此处解决您的问题,除非您的代码非常小或者您 follow the guidelines on creating a good example。

【讨论】:

  • 谢谢。我会尝试调试。我在 main() 中执行 MPI_Init 和 MPI_Finalize,并在 main 中调用的另一个函数中执行 MPI 操作。
猜你喜欢
  • 2017-12-31
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-11
相关资源
最近更新 更多