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
成为至少包含四个元素的数组来修复您的代码。
我是 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
成为至少包含四个元素的数组来修复您的代码。