平均分配内存(或尽可能公平)
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]
我正在使用 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]