【问题标题】:Error in MPI broadcastMPI 广播错误
【发布时间】:2014-05-07 12:20:27
【问题描述】:

抱歉,帖子太长了。我确实阅读了其他一些与 MPI 广播相关的错误,但我不能 找出我的程序失败的原因。 我是 MPI 的新手,我正面临这个问题。首先,我将解释我要做什么:

我的声明: ROWTAG 400

COLUMNTAG 800

  1. 创建 2 X 2 笛卡尔拓扑。
  2. 等级 0 具有整个矩阵。它希望将部分矩阵消散到 2 X 2 笛卡尔拓扑中的所有进程。现在,改为 我只是在处理整数。因此,对于 2 X 2 笛卡尔拓扑中的进程 P(i,j),(i - 行,j - 列),我希望它接收 (ROWTAG + i ) 在一条消息中和 (COLUMNTAG + j) 在另一条消息中。
  3. 我这样做的策略是: 进程:P(0,0)、P(0,1)、P(1,0)、P(1,1)

P(0,0) 拥有所有的初始数据。

P(0,0) 将 (ROWTAG+1)(在本例中为 401)发送到 P(1,0) - 本质上 P(1,0) 负责为所有进程消散与第 1 行相关的信息在第 1 行 - 我只是使用了阻塞发送

P(0,0) 将 (COLUMNTAG+1)(在本例中为 801)发送到 P(0,1) - 本质上,P(0,1) 负责为所有进程消散与第 1 列相关的信息在第 1 列中 - 使用了阻塞发送

对于每个进程,我创建了一个包含该行中所有进程的 row_group,并在其中创建了一个 row_comm(通信器对象)

对于每个进程,我创建了一个 col_group,其中包含该列中的所有进程,并从中创建了一个 col_comm(通信器对象)

此时,P(0,0) 已将与“i”行相关的信息提供给进程 P(i,0),P(0,0) 已将与“j”列相关的信息提供给 P(0,j)。我将 P(i,0) 和 P(0,j) 分别称为 row_head 和 col_head。

对于进程 P(i,j) ,P(i,0) 给出与第 i 行相关的信息,而 P(0,j) 给出与列 j 相关的信息。

我使用了广播电话:

MPI_Bcast(&row_data,1,MPI_INT,row_head,row_comm)
MPI_Bcast(&col_data,1,MPI_INT,col_head,col_comm)

请在此处找到我的代码:http://pastebin.com/NpqRwaWN

这是我看到的错误:

* MPI_Bcast 发生错误 在通信器 MPI COMMUNICATOR 5 CREATE FROM 3 上 MPI_ERR_ROOT:无效的根 * MPI_ERRORS_ARE_FATAL(您的 MPI 作业现在将中止)

如果有更好的方法来分配矩阵数据,请告诉我。

【问题讨论】:

  • 为什么要重新实现MPI_Cart_sub 的功能,而不是使用它将笛卡尔通信器划分为行和列子通信器?
  • 对不起,我不知道 MPI_Cart_sub 函数存在。正如我所说,我是 MPI 的新手。

标签: mpi


【解决方案1】:

您的程序中有几个错误。首先,row_Ranks 被声明为少一个元素,当写入它时,您可能会覆盖其他堆栈变量:

int col_Ranks[SIZE], row_Ranks[SIZE-1];
//                             ^^^^^^

在我的测试系统上,程序因此而挂起。

其次,您从matrixComm 创建新的子通信器,但在执行广播时使用后者的等级数来处理前者中的进程。那是行不通的。例如,在 2x2 笛卡尔通信器中,等级范围从 0 到 3。在任何按列或按行的子组中,只有两个具有等级 0 和 1 的进程 - 既没有等级 2,也没有等级 3。如果你看一下row_head 的值,其中两个是 2,因此错误。

如需更好的数据分发方式,请参考this extremely informative answer

【讨论】:

  • 非常感谢您的回复。这真的很有帮助。
猜你喜欢
  • 2011-03-01
  • 2020-04-01
  • 1970-01-01
  • 2011-12-31
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
相关资源
最近更新 更多