平均分配内存(或尽可能公平)

Distributing memory equally (or as fair as possible)

我正在使用 Python、MPI 和 FFTW 进行一些并行编程。我需要在 N 个进程之间平均分配一个长度为 G 的向量(或尽可能接近相等)。这导致以下数学问题:

给定两个整数 G、N,其中 G>N,我想找到和等于 G 的 N 个整数的集合 S,其中 "all the integers are as large as possible"。

示例:

G = 14, N = 3 --> S = {5, 5, 4}

G = 15, N = 3 --> S = {5, 5, 5}

G = 16, N = 3 --> S = {6, 5, 5}

计算 S 的算法由函数 fftw_mpi_local_size 在 FFTW 中实现。不过,我希望能够自己计算,使用 Python。也就是说,我正在寻找一种算法来解决我的问题,或者更好的是现有的 Python 函数来完成这项工作。

我的方法是找到可以在 N 个元素中均匀分布的最小值,您可以使用整数除法来实现。然后使用 % 求余数,并将 1 添加到该元素数。

def makeValues(G,N):
    val = G//N
    rem = G%N
    return [val]*(N-rem) + [val+1]*rem

>>> makeValues(14,3)
[4, 5, 5]
>>> makeValues(15,3)
[5, 5, 5]
>>> makeValues(16,3)
[5, 5, 6]