并行程序设计导论-第1章课后题
1.1
cid \(\in\) [0, p)
num = n / p
mod = n % p
my_first_i(cid) = cid * num + cid > n - m ? 1 : 0
my_last_i(cid) = (cid + 1) * num + cid >= n - m ? 1 : 0
1.2
二分最短完成时间,判断当前期望完成时间是否满足,不断二分即可
double f = 0, b = 1e9 + 7;
while(b - f > 1e-5) {
int mid = (b - f) / 2;
int sum = 0, cnt = p;
for (i = 0; i < n; ++i) {
sum += 完成作业i花费时间;
if (sum > mid) {
sum = 完成作业i花费时间;
--cnt;
}
}
--cnt; //最后sum不为0,需要一个核运行任务
if (cnt >= 0) { //说明只允许花费mid时间时
b = mid; //p个核可以完成任务
} else {
f = mid; //p个核无法在mid时间内完成任务
}
}
printf("最短完成时间为 %f Sec\n", b);
1.3
for (divisor = 2, core_difference = 1; divisor <= p; divisor *= 2, core_difference *= 2) {
for (i = 0; i < p; i += divisor) {
work_model[i] = receive;
work_model[i + core_difference] = send;
work(i, i + core_difference)
}
}
1.4
for (i = 1; i <= p; i *= 2) {
for (j = 0; j < p; j += i * 2) {
work(j, j ^ i)
}
}
1.5
for (i = 1; i <= p; i *= 2) {
for(j = 0; j < p; j += i * 2) {
if(j ^ i < p)
work(j, j ^ i);
}
}
1.6
a. 2(p - 1) + 1
b. 2\(log_2{p}\) + 1
1.7
数据分成若干份分发,为数据并行
各个核将结果相加汇总,为任务并行