是否有一种有效的算法可以根据每个进程必须放弃或接收多少元素来在进程上重新分配向量?

Is there an efficient algorithm to redistribute a vector over processes based on how many elements each process has to give up or recieve?

我正在尝试在一组进程上重新分配数组(类似网格)以满足负载平衡需求。我的特殊要求是数组元素只能移动到空间相邻的进程,因为只有元素之间靠前的元素可以轻松移动。

在上面的示例设置中,所有前三个进程都应向最后一个进程捐赠元素:

# Process, Neighbors, Nbr. of Elements to move in/out
0, (1 2), -23
1, (0 3), -32
2, (0 3), -13
3, (1 2), +68

目前,我正计划通过阻塞双向 MPI 通信来实现此功能,其中事务发生类似于以下内容:

P0 sends 23 elements to P1
P1 sends 55 elements to P3      (Should only send 32 originally, + the 23 it got from P0)
P2 sends 13 elements to P3

所以,我想知道是否有一种已知的(最好通过双向 MPI 通信轻松并行化)算法来处理这种情况。

此外,我考虑过“拉平”流程,并考虑它们形成一个简单的环。这简化了事情,但有可能产生噪音并且可能无法很好地扩展:

P0 sends 23 elements to P1
P1 sends 55 elements to P2    (Even  though it's not one of its spacial neighbors)
P2 sends 68 elements to P3

Metis/ParMetis 图书馆可以处理这个吗?

我将概括您的问题:您正在寻找一种负载平衡算法,其中进程通过图形连接,并且只能将负载转移到 graph-connected 个进程。这个算法存在:它被称为“基于扩散的负载平衡”,它最初是由 Cybenko 提出的。一个简单的网络搜索将为您提供大量参考资料。