我想在进程之间平衡一组矩阵块。矩阵块具有不同的大小,尽管通常一个单独的块占主导地位,具有相似的大小或什至大于所有其他块的组合。进程的数量可能比块的数量大得多和小得多。每个块可以存储在单个进程中,也可以作为 ScaLAPACK 阵列分布。平衡应在质量上满足以下条件:
- 没有进程应该接收比 target_load = sum(size(blocks[:])) / n_procs 更多的矩阵元素
- 任何块都不应分布在比 size(block) / target_load 更多的进程上。MPI 通信器可能从 mpi_comm_world 中分离出来
- MPI 通信器不能重叠(块 1 和 2 都分布在进程 0:4 上很好,但块 1 分布在进程 0:3 上,块 2 分布在进程 2:5 上是不行的;未分布的块可以任意堆叠在分布式块之上)
我知道这种分布将取决于应用前两个条件的强度和优先级(第三个条件应该严格适用)。尽管如此,是否有任何算法有助于对这些条件进行一些解释?