MPI_Type_free 错误

MPI_Type_free ERROR

我是 MPI 的新手,我正在尝试用 c 编写一些代码。这是我的几行代码:

void update(float ** cur, float ** next, int dimension, int numOfProcesses, int rank)
{       
    int i,j,numNeighbor, processReceived, receivedTop=0, receivedBot=0, 
        receivedLeft=0, receivedRight=0;
    float *recvTop, *recvBot, *recvLeft, *recvRight, ** recvArray;
    int topProcess, botProcess, leftProcess, rightProcess;
    int sq = (int)sqrt(numOfProcesses);
    int k = 0;

    MPI_Request sendRequest[4], recvRequest[4];
    MPI_Status status;
    MPI_Datatype row;

    MPI_Type_vector(dimension, 1, dimension, MPI_FLOAT, &row);
    MPI_Type_commit(&row);

    leftProcess = left(rank,  numOfProcesses);
    MPI_Isend(&(cur[0][0]), 1, row, leftProcess, rank, MPI_COMM_WORLD, sendRequest + LEFT);

    topProcess = top(rank,numOfProcesses);
    MPI_Isend(&(cur[0][0]), dimension, MPI_FLOAT, topProcess, rank , MPI_COMM_WORLD, sendRequest + TOP);

    botProcess = bot(rank,numOfProcesses);
    MPI_Isend((cur[dimension-1]) , dimension,  MPI_FLOAT, botProcess , rank , MPI_COMM_WORLD, sendRequest + BOT);

    rightProcess = right(rank,numOfProcesses);
    MPI_Isend(&(cur[0][dimension-1]), dimension, row, rightProcess, rank, MPI_COMM_WORLD, sendRequest + RIGHT);

    recvLeft = malloc(dimension*sizeof(float));
    recvRight = malloc(dimension*sizeof(float));
    recvTop = malloc(dimension*sizeof(float));
    recvBot = malloc(dimension*sizeof(float));
    recvArray = malloc(4*sizeof(float*));

    recvArray[0] = recvTop;
    recvArray[1] = recvBot;
    recvArray[2] = recvLeft;
    recvArray[3] = recvRight;

    MPI_Irecv(recvTop,dimension, MPI_FLOAT, topProcess, topProcess, MPI_COMM_WORLD, recvRequest + TOP);
    MPI_Irecv(recvBot,dimension, MPI_FLOAT, botProcess, botProcess, MPI_COMM_WORLD, recvRequest + BOT);
    MPI_Irecv(recvLeft,  dimension, MPI_FLOAT, leftProcess, leftProcess, MPI_COMM_WORLD, recvRequest + LEFT);
    MPI_Irecv(recvRight, dimension, MPI_FLOAT, rightProcess, rightProcess, MPI_COMM_WORLD, recvRequest+RIGHT);
    if(rank/sq == 0) recvTop = NULL;
    if(rank%sq == 0) recvLeft = NULL;
    if(rank%sq == sq - 1) recvRight = NULL;
    if(rank/sq == sq - 1) recvBot = NULL;

    for(i=1; i<dimension-1; i++)
    {
        for(j=1; j<dimension-1; j++)
        {
            setArray(cur, next, i, j, NULL, -1);
        }
    }

    for(i=0; i<4; i++)
    {    
        MPI_Waitany(4,recvRequest, &processReceived, &status);

        if(processReceived == TOP)
        {   
            if(recvTop != NULL)
            {
                for(j=1; j<dimension-1; j++)
                {
                    setArray(cur, next, 0, j, recvArray, TOP);
                }
            }
            receivedTop = 1;            
        }

        else if(processReceived == BOT)
        {
            if(recvBot != NULL)
            {
                for(j=1; j<dimension-1; j++)
                {
                    setArray(cur, next, dimension-1, j, recvArray, BOT);
                }
                receivedBot = 1;
            }
        }

        else if(processReceived == LEFT)
        {
            if(recvLeft != NULL)
            {
                for(j=1; j<dimension-1; j++)
                {
                    setArray(cur, next, j, 0, recvArray, LEFT);
                }
                receivedLeft = 1;
            }
        }

        else if(processReceived == RIGHT)
        {
            if(recvRight != NULL)
            {
                for(j=1; j<dimension-1; j++)
                {
                    setArray(cur, next, j, dimension-1, recvArray, RIGHT);
                }
                receivedRight = 1;
            }
        }        
    }

    if(recvTop != NULL)
    {
        if(recvLeft != NULL)
            setArray(cur, next, 0, 0, recvArray, TL);

        if(recvRight != NULL)
            setArray(cur, next, 0, dimension-1, recvArray, TR);
    }

    if(recvBot != NULL)
    {
        if(recvLeft != NULL)
            setArray(cur, next, dimension-1, 0, recvArray, BL);

        if(recvRight != NULL)
            setArray(cur, next, dimension-1, dimension-1, recvArray, BR);
    }

    MPI_Waitall(4, sendRequest, &status);
    free(recvLeft);
    free(recvRight);
    free(recvTop);
    free(recvBot);
    free(recvArray);
    MPI_Type_free(&row);
}

当我到达 MPI_Type_free 时出现此错误:

Fatal error in PMPI_Type_free: Invalid datatype, error stack: PMPI_Type_free(157): MPI_Type_free(datatype_p=0xbf867978) failed PMPI_Type_free(89).: Invalid datatype

我在 google 中搜索过这个,但我发现唯一有用的是我在提交时可能有一些错误。

MPI_ERR_TYPE Invalid datatype argument. May be an uncommitted MPI_Datatype (see MPI_Type_commit)

我无法理解这个问题。我是否正确提交了我的变量?谁能帮忙?

最有可能的问题出在:

MPI_Status status; // <----- HERE
...
MPI_Waitall(4, sendRequest, &status);

您正在等待四个请求完成,但传递了一个指向单个 MPI_Status 对象的指针。其他三个状态覆盖堆栈中的其他变量,包括 row。结果是一些垃圾类型句柄被传递给 MPI_Type_free。通过使 status 成为至少包含四个元素的数组来修复您的代码。