我试图在一定数量的进程之间尽可能均匀地分配矩阵的行来执行某个任务,但事实是,鉴于分裂可能不精确,我无法弄清楚如何分配这些行,即使我们假设除法相等,它也很容易做到。所以问题就是这样:
(假设确切划分):
//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
提前感谢。
答案 0 :(得分:1)
显然,某些进程将包含比其他进程更多的行。只需在前N个进程中传播剩余的N行(&#34;剩余时间&#34;)。
更新
例如:
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);