C MPI\u类型\u自由错误
我是MPI新手,我正在尝试用c编写一些代码。以下是我的一些代码行: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
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上传了我的函数。我无法从一开始就编写一个小程序。你能不能在我的函数中显示一个缺陷,以便在这个示例中与你“同行”呢?让我们来看看。