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 行替换它。生活远比你想象的简单。