两次通过后 MPI 实现停滞
MPI Implimentation stalling after two passes
我对 MPI 比较陌生,所以我不确定为什么这段代码没有按预期运行。这个想法是将一个整数传递给一个随机节点并递减它直到达到 0。当我尝试 运行 它时,它传递整数两次并停止。有人可以指出我正确的方向吗?谢谢!
if (rank == 0)
{
potato = rand() % 100 + size; // generate a random number between the number of processors and 100
sendTo = rand() % (size - 1) + 1; // generate a number (not 0) to represent the process to send the potato to
MPI_Send(&potato, 1, MPI_INT, sendTo, 0, MPI_COMM_WORLD); // send the potato
}
else // any process other than 0
{
MPI_Recv(&potato, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //receive potato
if (potato == -1) // check for termination int
return;
--potato; // decrement potato
if (potato != 0)
{
do
{
sendTo = rand() % (size - 1) + 1; // send to a process 1 through size - 1
} while (sendTo == rank || sendTo == 0); // make sure it won't send the potato to itself or 0
printf("Node %d has the potato, passing to node %d.\n", rank, sendTo);
MPI_Send(&potato, 1, MPI_INT, sendTo, 0, MPI_COMM_WORLD);
}
else // potato == 0
{
printf("Node %d is it, game over.\n", rank);
potato = -1;
for (int i = 1; i < size; ++rank) // send termination message
MPI_Send(&potato, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
}
输出:
Potato: 44
Node 3 has the potato, Passing to node 2.
Node 2 has the potato, Passing to node 3.
您的代码缺少一些循环。在您的示例中,要使节点 3 第二次收到土豆,必须再次调用 MPI_Recv
。
if (rank == 0)
{
potato = rand() % 100 + size; // generate a random number between the number of processors and 100
sendTo = rand() % (size - 1) + 1; // generate a number (not 0) to represent the process to send the potato to
MPI_Send(&potato, 1, MPI_INT, sendTo, 0, MPI_COMM_WORLD); // send the potato
}
else // any process other than 0
{
/* Here is the loop beginning, while patato is not -1, continue reading*/
while (1)
{
MPI_Recv(&potato, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //receive potato
if (potato == -1) // check for termination int
return;
--potato; // decrement potato
if (potato != 0)
{
do
{
sendTo = rand() % (size - 1) + 1; // send to a process 1 through size - 1
} while (sendTo == rank || sendTo == 0); // make sure it won't send the potato to itself or 0
printf("Node %d has the potato, passing to node %d.\n", rank, sendTo);
MPI_Send(&potato, 1, MPI_INT, sendTo, 0, MPI_COMM_WORLD);
}
else // potato == 0
{
printf("Node %d is it, game over.\n", rank);
potato = -1;
for (int i = 1; i < size; ++rank) // send termination message
MPI_Send(&potato, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
}
}
我对 MPI 比较陌生,所以我不确定为什么这段代码没有按预期运行。这个想法是将一个整数传递给一个随机节点并递减它直到达到 0。当我尝试 运行 它时,它传递整数两次并停止。有人可以指出我正确的方向吗?谢谢!
if (rank == 0)
{
potato = rand() % 100 + size; // generate a random number between the number of processors and 100
sendTo = rand() % (size - 1) + 1; // generate a number (not 0) to represent the process to send the potato to
MPI_Send(&potato, 1, MPI_INT, sendTo, 0, MPI_COMM_WORLD); // send the potato
}
else // any process other than 0
{
MPI_Recv(&potato, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //receive potato
if (potato == -1) // check for termination int
return;
--potato; // decrement potato
if (potato != 0)
{
do
{
sendTo = rand() % (size - 1) + 1; // send to a process 1 through size - 1
} while (sendTo == rank || sendTo == 0); // make sure it won't send the potato to itself or 0
printf("Node %d has the potato, passing to node %d.\n", rank, sendTo);
MPI_Send(&potato, 1, MPI_INT, sendTo, 0, MPI_COMM_WORLD);
}
else // potato == 0
{
printf("Node %d is it, game over.\n", rank);
potato = -1;
for (int i = 1; i < size; ++rank) // send termination message
MPI_Send(&potato, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
}
输出:
Potato: 44
Node 3 has the potato, Passing to node 2.
Node 2 has the potato, Passing to node 3.
您的代码缺少一些循环。在您的示例中,要使节点 3 第二次收到土豆,必须再次调用 MPI_Recv
。
if (rank == 0)
{
potato = rand() % 100 + size; // generate a random number between the number of processors and 100
sendTo = rand() % (size - 1) + 1; // generate a number (not 0) to represent the process to send the potato to
MPI_Send(&potato, 1, MPI_INT, sendTo, 0, MPI_COMM_WORLD); // send the potato
}
else // any process other than 0
{
/* Here is the loop beginning, while patato is not -1, continue reading*/
while (1)
{
MPI_Recv(&potato, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE); //receive potato
if (potato == -1) // check for termination int
return;
--potato; // decrement potato
if (potato != 0)
{
do
{
sendTo = rand() % (size - 1) + 1; // send to a process 1 through size - 1
} while (sendTo == rank || sendTo == 0); // make sure it won't send the potato to itself or 0
printf("Node %d has the potato, passing to node %d.\n", rank, sendTo);
MPI_Send(&potato, 1, MPI_INT, sendTo, 0, MPI_COMM_WORLD);
}
else // potato == 0
{
printf("Node %d is it, game over.\n", rank);
potato = -1;
for (int i = 1; i < size; ++rank) // send termination message
MPI_Send(&potato, 1, MPI_INT, i, 0, MPI_COMM_WORLD);
}
}
}