并行程序设计导论-第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

数据分成若干份分发,为数据并行
各个核将结果相加汇总,为任务并行

posted @ 2021-03-13 22:42  llzhh  阅读(1123)  评论(0编辑  收藏  举报