MPI Scatter with Recv 阻止代码执行
MPI Scatter with Recv blocking code execution
我的代码有什么问题? MPI_Recv 正在阻塞代码,我应该使用 MPI_Gather 将所有值带到主进程吗?不确定我是否可以将 MPI_Scatter 与 MPI_Recv 一起使用。
int rank;
int size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0)
{
int matrix[size];
// Filling matrix here
...
int value;
MPI_Scatter(matrix, 1, MPI_INT, &value, 1, MPI_INT, 0, MPI_COMM_WORLD);
printf("%d\n", value);
}
else
{
int value;
MPI_Recv(&value, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("%d\n", value);
}
MPI_Finalize();
MPI_Scatter
例程是一个so-called“集体”,意味着所有进程都应该调用它。虽然你是对的,在从进程零分散后,每个其他进程都在隐喻意义上“接收”数据,从技术上讲,它们在分散调用的接收缓冲区中接收数据。
所以你应该删除整个条件,只用 MPI_Scatter
行替换它。生活远比你想象的简单。
我的代码有什么问题? MPI_Recv 正在阻塞代码,我应该使用 MPI_Gather 将所有值带到主进程吗?不确定我是否可以将 MPI_Scatter 与 MPI_Recv 一起使用。
int rank;
int size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
if (rank == 0)
{
int matrix[size];
// Filling matrix here
...
int value;
MPI_Scatter(matrix, 1, MPI_INT, &value, 1, MPI_INT, 0, MPI_COMM_WORLD);
printf("%d\n", value);
}
else
{
int value;
MPI_Recv(&value, 1, MPI_INT, 0, MPI_ANY_TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
printf("%d\n", value);
}
MPI_Finalize();
MPI_Scatter
例程是一个so-called“集体”,意味着所有进程都应该调用它。虽然你是对的,在从进程零分散后,每个其他进程都在隐喻意义上“接收”数据,从技术上讲,它们在分散调用的接收缓冲区中接收数据。
所以你应该删除整个条件,只用 MPI_Scatter
行替换它。生活远比你想象的简单。