0

我正在运行在 7 节点集群上执行大型矩阵转换的应用程序。节点通过 QDR 40 Gbit Infiniband 连接。系统上安装了 Open MPI 1.4.3。

给定矩阵变换需要节点之间以这样一种方式进行大量数据交换,即在每个算法步骤中,有一个节点发送数据,所有其他节点接收。进程数等于使用的节点数。我不得不说我在 MPI 方面相对较新,但执行此操作的理想方法似乎是使用 MPI_Bcast。

对于一些不太大的矩阵,一切都很好。但是,当矩阵大小增加时,有时应用程序会挂起并永远停留在那里。

我不完全确定,但我的代码似乎没有错误。我详细跟踪了它,以检查在特定调用 MPI_Bcast 之前是否有一些未完成的集体操作,但一切看起来都很好。此外,对于该特定调用,在所有进程中都正确设置了 root 以及消息类型和大小,当然,在所有进程中都会调用 MPI_Bcast。

我还运行了很多场景(在不同大小的矩阵上运行应用程序并更改进程数量)以确定何时发生这种情况。可以观察到的情况如下:

  • 对于相同大小的矩阵,如果我决定进程数,应用程序成功完成
  • 但是,对于给定数量的进程,应用程序将挂起一些稍大的矩阵
  • 对于给定的矩阵大小和我有程序挂起的进程数,如果我在每个 MPI_Bcat 调用中减小消息的大小两次(当然结果不会正确),就不会挂起

所以,在我看来,问题可能出在 MPI 使用的某些缓冲区中,也许应该更改一些默认的 MCA 参数,但是,正如我所说,我在 MPI 编程方面没有很多经验,我还没有找到这个问题的解决方案。所以,问题是是否有人遇到过类似的问题,也许知道这是否可以通过设置适当的 MCA 参数来解决,或者知道任何其他解决方案或解释?

4

1 回答 1

0

就像@Hristo 已经提到的,请从Open MPI 网站上使用更新的 OMPI 版本开始 。当前的稳定版本是 1.6.5,所以这是你应该得到的。机会是 - 这将使问题消失。

如果问题仍然存在,那么处理它的最佳方法是在 OMPI 用户邮件列表中进行讨论——那里的人会很快处理它。

如果您仍然希望使用 MCA 参数,我建议您从这些开始:

--mca btl_openib_flags <hex value>
--mca mpi_leave_pinned <0|1>
于 2013-07-26T21:06:32.347 回答