【发布时间】:2013-07-25 23:01:44
【问题描述】:
我正在运行在 7 节点集群上执行大型矩阵转换的应用程序。节点通过 QDR 40 Gbit Infiniband 连接。系统上已安装 Open MPI 1.4.3。
给定的矩阵变换需要节点之间以这样一种方式进行大量数据交换,即在每个算法步骤中,都有一个节点发送数据,其他节点接收。进程数等于使用的节点数。我不得不说我在 MPI 方面相对较新,但执行此操作的理想方法似乎是使用 MPI_Bcast。
对于一些不太大的矩阵,一切正常。但是,当矩阵大小增加时,有时应用程序会挂起并永远停留在那里。
我不完全确定,但我的代码中似乎没有错误。我详细跟踪了它,以检查在特定调用 MPI_Bcast 之前是否有一些未完成的集体操作,但一切看起来都很好。此外,对于该特定调用,在所有进程中都正确设置了 root,以及消息类型和大小,当然,在所有进程中都会调用 MPI_Bcast。
我还运行了很多场景(在不同大小的矩阵上运行应用程序并更改进程数量)以确定何时发生这种情况。可以观察到以下几点:
- 对于相同大小的矩阵,如果我指定进程数,应用程序将成功完成
- 但是,对于给定数量的进程,应用程序会因一些稍大的矩阵而挂起
- 对于给定的矩阵大小和程序挂起的进程数,如果我将每个 MPI_Bcat 调用中的消息大小减小两次(当然结果不会正确),就不会挂起
所以,在我看来,问题可能出在 MPI 使用的某些缓冲区中,也许应该更改一些默认的 MCA 参数,但是,正如我所说,我在 MPI 编程方面没有很多经验,而且我还没有找到解决这个问题的方法。 所以,问题是是否有人遇到过类似的问题,也许知道这是否可以通过设置适当的 MCA 参数来解决,或者知道任何其他解决方案或解释?
【问题讨论】:
-
Open MPI 1.4.3 是一款非常古老的软件。如果您还没有这样做,我建议您在Open MPI users mailing list 上询问。顺便问一下,广播了多少数据(以字节为单位)?
-
Hristo,感谢您的快速回复。消息大小从 50 到 200 MB。但是,在 MPI_Bcast 的特定调用挂起之前,我有很多 MPI_Bcast 调用,其中包含成功完成的相同大小的消息。
-
您是否尝试过使用另一个 MPI 实现的相同代码,例如MVAPICH 还是英特尔 MPI? OMPI 使用的大型消息的默认广播算法不应导致锁定,除非发生真正的错误。
-
不,我没有尝试任何其他 MPI 实现,但我肯定会。再次感谢。
标签: mpi openmpi infiniband