这些退出代码对于MPI程序意味着什么?

这些退出代码对于MPI程序意味着什么?,mpi,Mpi,当我试图运行MPI程序但失败时。它说: job aborted: [ranks] message [0] process exited without calling finalize [1-3] terminated 错误分析表明退出代码为0xc000005 然后我用谷歌搜索它,有人说用MPI\u Init\u thread代替,但它给了我255作为退出代码 我怎样才能修好它?排名0的过程有什么问题 以下是使用MPI发送和接收数据的代码片段: // MPI things

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

job aborted:

[ranks] message

[0] process exited without calling finalize

[1-3] terminated
错误分析表明退出代码为
0xc000005

然后我用谷歌搜索它,有人说用
MPI\u Init\u thread
代替,但它给了我
255
作为退出代码

我怎样才能修好它?排名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);
    }
//MPI事物
MPI通信等级(MPI通信世界和任务ID);
//主人
如果(taskid==0)
{
//printf(“任务ID:%d”,任务ID);
平均值=非熟练工人/非熟练工人;
额外=n解雇%n名工人;
mtype=来自主控;
偏移量=0;
//存储卷[Itemp[n]]
对于(int i=0;i对于(int dest=1;dest,MPI的退出代码几乎没有任何意义,因为您有多个进程都返回自己的错误代码。依赖程序发出的错误消息会更有帮助。幸运的是,您的程序做到了

[0] process exited without calling finalize
这可能意味着两件事之一

  • 您的程序已完成,但未调用
    MPI\u Finalize
    。这是一个非常简单的修复方法。请检查以确保您的程序可以在任何地方正常终止,它都会调用
    MPI\u Finalize
    。但这可能是您的问题,也可能不是
  • 您的程序异常终止。这通常更难跟踪,并且可能需要一些常见的技巧。如果是问题,我们可能无法修复您的问题,除非您的代码非常小或您需要

  • 显示代码,它可以是任何东西。尝试找出进程在代码中的位置。它应该是MCVE…抱歉,这是我第一次发布我的问题。我附加了一个代码片段以使其更好谢谢你。我将尝试调试。我在main()中执行MPI_Init和MPI_Finalize,并在main()中调用的另一个函数中执行MPI操作。