【问题标题】:MPI Scatter and GatherMPI 分散和聚集
【发布时间】:2017-02-28 00:23:16
【问题描述】:

我正在开发一个使用 MPI 进行矩阵乘法的程序。矩阵 A 被广播到所有进程。矩阵 B 被转置,然后分散在所有进程中。这样A可以直接乘以B的每一列。到目前为止它正在工作,我从各个过程中获得了结果并且它们是正确的。现在我坚持在根进程中收集所有结果并显示它们。

MPI_Scatter(&transpose_mat, num_cols2, MPI_INT, column2, num_cols2, MPI_INT, 1, MPI_COMM_WORLD);

这就是我在所有进程中分散数据的方式。

column3 = mult(result, column2);

函数mult计算相乘结果并返回一个列向量column3

if (rank == root)
    {
        MPI_Gather(&column3, 4, MPI_INT, &final, 4, MPI_INT, root, MPI_COMM_WORLD);

        for (int i = 0; i < 4;++i)
        {
            for (int j = 0; j < 1; ++j)
            {
                cout << final[i][j] << endl;    
            }
        }
    }

这就是我尝试将它们收集回来的方法。

但它没有显示任何输出,即使我试图打印出 final[][]

谁能解释一下是什么问题?

【问题讨论】:

  • MPI_Gather不是集体操作吗?换句话说,通信器中的所有进程不应该调用它吗?似乎只有您的根进程调用它。
  • 是的,谢谢,现在我把它从 if 语句中去掉了,但结果是一样的。数据未收集到最终矩阵中。
  • 那么现在您希望我们诊断您未向我们展示的代码中的问题吗?
  • 对不起。我应该发布完整的代码。我现在已经解决了。谢谢

标签: mpi scatter


【解决方案1】:

得到了答案,MPI_Allgather() 为我工作。 MPI_Gather() 没有显示任何内容,但 MPI_Allgather() 将所有进程中的数据(在我的情况下为列矩阵)收集到缓冲区(在我的情况下为矩阵)。

【讨论】:

    猜你喜欢
    • 2019-02-11
    • 2012-09-09
    • 1970-01-01
    • 2011-06-09
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    相关资源
    最近更新 更多