我正在运行在 7 节点集群上执行大型矩阵转换的应用程序。节点通过 QDR 40 Gbit Infiniband 连接。系统上安装了 Open MPI 1.4.3。
给定矩阵变换需要节点之间以这样一种方式进行大量数据交换,即在每个算法步骤中,有一个节点发送数据,所有其他节点接收。进程数等于使用的节点数。我不得不说我在 MPI 方面相对较新,但执行此操作的理想方法似乎是使用 MPI_Bcast。
对于一些不太大的矩阵,一切都很好。但是,当矩阵大小增加时,有时应用程序会挂起并永远停留在那里。
我不完全确定,但我的代码似乎没有错误。我详细跟踪了它,以检查在特定调用 MPI_Bcast 之前是否有一些未完成的集体操作,但一切看起来都很好。此外,对于该特定调用,在所有进程中都正确设置了 root 以及消息类型和大小,当然,在所有进程中都会调用 MPI_Bcast。
我还运行了很多场景(在不同大小的矩阵上运行应用程序并更改进程数量)以确定何时发生这种情况。可以观察到的情况如下:
- 对于相同大小的矩阵,如果我决定进程数,应用程序成功完成
- 但是,对于给定数量的进程,应用程序将挂起一些稍大的矩阵
- 对于给定的矩阵大小和我有程序挂起的进程数,如果我在每个 MPI_Bcat 调用中减小消息的大小两次(当然结果不会正确),就不会挂起
所以,在我看来,问题可能出在 MPI 使用的某些缓冲区中,也许应该更改一些默认的 MCA 参数,但是,正如我所说,我在 MPI 编程方面没有很多经验,我还没有找到这个问题的解决方案。所以,问题是是否有人遇到过类似的问题,也许知道这是否可以通过设置适当的 MCA 参数来解决,或者知道任何其他解决方案或解释?