并行程序设计第一次作业

定义最后返回的累加值$sum$,以及各个核中操作数的始末$my \underline{ }first \underline{ } i, my \underline{ } last \underline{ } i$:

1
2
3
sum=0;
my_first_i=...;
my_last_i=...;

在多个核中分别进行累加操作:

1
2
3
4
for(i=my_first_i;my_i<my_last_i;i++){
t=computeVal();//当前核的累加操作
sum+=t;
}

当有$n$个数且有p个核时,可以知道

大多数核处理的数的数量为$ave=n/p$个;

平均分配后剩余的数字有$remain=n%p$个;

给每个核进行分配,如果不整除,就把余数分配到各个核中。如果被分配到,则当前核个数+1;反之则不变。

1
2
3
4
5
6
7
8
9
10
ave=n/p;
remain=n%p;
if(cur_flag<remain){
cur_count=ave+1;
cur_i=cur_rank*cur_count;
}
else{
cur_count=ave;
cur_i=cur_rank*cur_count+remain;
}