MPI广播出错

时间:2014-03-28 06:49:34

标签: mpi

对不起,很长的帖子。我确实读过其他一些与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)
  4. 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(communicator对象)

    对于每个进程,我创建了一个包含该列中所有进程的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创建3 MPI_ERR_ROOT:root无效 * MPI_ERRORS_ARE_FATAL(您的MPI工作现在将中止)

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

1 个答案:

答案 0 :(得分: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