在进程之间几乎平均分配任务
Distributing a task in almost equal parts between processes
我试图在一定数量的进程之间尽可能均匀地分配矩阵的行来完成某项任务,问题是考虑到除法可能不准确,我无法弄清楚如何分配这些行,即使当我们假设划分相等时它也很容易做到。所以问题是这样的:
(假设精确除法):
//code...
work = rows / numprocs;
//leftover = rows % numprocs; /* what to do with this !! */
for(i = my_id * work; i < (my_id * work + work); i ++){
// do things...
//more code
提前致谢。
显然,某些进程将包含比其他进程更多的行。只需将剩余的 N 行 ("leftovers") 分布在前 N 个进程中。
更新:
例如:
M = 22 rows
P = 5 processes
Q = M / P = 22 / 5 = 4
N = M - Q * P = 22 % 5 = 2
proc #0 - 5 rows
proc #1 - 5 rows
proc #2 - 4 rows
proc #3 - 4 rows
proc #4 - 4 rows
更新 2:
获取行数的函数,进程中的起始行:
// my_id = 0 -> (P-1)
R = (my_id < N) ? (M / P + 1) : (M / P);
S = (my_id < N) ? (my_id * R) : (my_id * R + N);
我试图在一定数量的进程之间尽可能均匀地分配矩阵的行来完成某项任务,问题是考虑到除法可能不准确,我无法弄清楚如何分配这些行,即使当我们假设划分相等时它也很容易做到。所以问题是这样的:
(假设精确除法):
//code...
work = rows / numprocs;
//leftover = rows % numprocs; /* what to do with this !! */
for(i = my_id * work; i < (my_id * work + work); i ++){
// do things...
//more code
提前致谢。
显然,某些进程将包含比其他进程更多的行。只需将剩余的 N 行 ("leftovers") 分布在前 N 个进程中。
更新:
例如:
M = 22 rows
P = 5 processes
Q = M / P = 22 / 5 = 4
N = M - Q * P = 22 % 5 = 2
proc #0 - 5 rows
proc #1 - 5 rows
proc #2 - 4 rows
proc #3 - 4 rows
proc #4 - 4 rows
更新 2:
获取行数的函数,进程中的起始行:
// my_id = 0 -> (P-1)
R = (my_id < N) ? (M / P + 1) : (M / P);
S = (my_id < N) ? (my_id * R) : (my_id * R + N);