C MPI\u类型\u自由错误

C MPI\u类型\u自由错误,c,mpi,C,Mpi,我是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; flo

我是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);
}
void更新(float**cur,float**next,int-dimension,int-numOfProcesses,int-rank)
{       
int i,j,numnighbor,processReceived,receivedTop=0,receivedBot=0,
receivedLeft=0,receivedRight=0;
浮动*recvTop、*recvBot、*recvLeft、*RECVRRIGHT、**recvArray;
int-topProcess、botProcess、leftProcess、rightProcess;
int sq=(int)sqrt(numof进程);
int k=0;
MPI_请求sendRequest[4],RecvreRequest[4];
MPI_状态;
MPI_数据类型行;
MPI类型向量(维度、1、维度、MPI浮点和行);
MPI_类型_提交(&row);
leftProcess=left(秩,numofprocesss);
MPI Isend(&(cur[0][0]),1,行,leftProcess,秩,MPI COMM_WORLD,sendRequest+LEFT);
topProcess=top(排名,NUMOF进程);
MPI Isend(&(cur[0][0])、维度、MPI浮点、topProcess、rank、MPI COMM世界、sendRequest+TOP);
botProcess=bot(秩,numofprocesss);
MPI Isend((当前[dimension-1])、dimension、MPI浮点、botProcess、rank、MPI通信世界、sendRequest+BOT);
rightProcess=right(秩,numof进程);
MPI Isend(&(cur[0][dimension-1])、维度、行、右流程、排名、MPI通信世界、sendRequest+右);
recvLeft=malloc(尺寸*尺寸(浮动));
recvRight=malloc(尺寸*sizeof(浮动));
recvTop=malloc(尺寸*sizeof(浮动));
recvBot=malloc(尺寸*sizeof(浮动));
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);
如果(秩/sq==0)recvTop=NULL;
如果(秩%sq==0)recvLeft=NULL;
如果(秩%sq==sq-1)recvRight=NULL;
如果(秩/sq==sq-1)recvBot=NULL;

对于(i=1;i而言,问题最有可能在于:

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

MPI_Status Status;//你能在这里添加一个好的吗?你给出的代码片段不足以告诉你任何有用的东西。你是说更多的代码吗?@GillesI上传了我的函数。我无法从一开始就编写一个小程序。你能不能在我的函数中显示一个缺陷,以便在这个示例中与你“同行”呢?让我们来看看。