在并行 MPI 代码中,我遇到了负载平衡问题。我的 2D 计算域分布在 2D MPI 笛卡尔拓扑上,这导致每个 MPI 进程的 2D 子域大小相等。但是,每个域要做的工作量取决于属于每个域的“计算点”的数量。而且这些计算点的密度非常不均匀,导致某些进程的计算点比其他进程多得多。因此,我的代码的整体并行效率可能会变得很差。
为了解决这个问题,我想调整我的 2D 域分解的大小,以重新平衡我的 MPI 进程中的计算点数量。因此,我正在寻找一种允许我实现此优化过程的算法。约束是:
- 要分布的全局网格的 X 和 Y 维度
(Gx, Gy)是固定的(整数表示要在每个维度中跨 MPI 进程分布的网格点的数量) - MPI 进程的总数是固定的。让
Ntot这个数字,然后我们必须保留Nx * Ny = Ntot任何有效的(Nx, Ny)解决方案。 - 每个 MPI 进程的 X 和 Y 网格点的数量可以不同。唯一的限制是所有 MPI 进程的单个 X 网格点的总和应等于
Gx. 同样对于Gy. - 网格上计算点的密度是先验已知的。每个网格点可能有零到十个这样的计算点。
任何方法/算法来解决这个问题的任何想法?我完全意识到可能没有完美的解决方案,但是任何允许改善负载平衡的网格映射都已经很好了。