对不起,很长的帖子。我确实读过其他一些与MPI广播相关的错误,但我无法做到 找出我的程序失败的原因。 我是MPI的新手,我正面临着这个问题。首先,我将解释我想要做的事情:
我的声明: ROWTAG 400
COLUMNTAG 800
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工作现在将中止)
如果有更好的方法来分发矩阵数据,请告诉我。
答案 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。