【发布时间】:2014-05-07 12:20:27
【问题描述】:
抱歉,帖子太长了。我确实阅读了其他一些与 MPI 广播相关的错误,但我不能 找出我的程序失败的原因。 我是 MPI 的新手,我正面临这个问题。首先,我将解释我要做什么:
我的声明: ROWTAG 400
COLUMNTAG 800
- 创建 2 X 2 笛卡尔拓扑。
- 等级 0 具有整个矩阵。它希望将部分矩阵消散到 2 X 2 笛卡尔拓扑中的所有进程。现在,改为 我只是在处理整数。因此,对于 2 X 2 笛卡尔拓扑中的进程 P(i,j),(i - 行,j - 列),我希望它接收 (ROWTAG + i ) 在一条消息中和 (COLUMNTAG + j) 在另一条消息中。
- 我这样做的策略是: 进程: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