CSAPP练习题5.5和5.6
看到这篇文章的一定是对练习题5.5和5.6的课后习题答案有疑惑的人。铺垫我就不多说了,直接上我自己的理解吧。
我认为课后习题的答案应该是没有问题的,可以这么去理解
1、首先,对于5.5题的代码,CEP是5
result += a[i] * xpwr
xpwr = x * xpwr
假设a[i] * xpwr的计算结果保存在tmp中,大部分人的疑惑肯定是a[i] * xpwr和x * xpwr计算需要5个周期,然后算完的结果tmp再加回到result中,那不就是8个周期吗。
其实,我们不难发现,a[i] * xpwr和x * xpwr的计算和result无关,所以当前次迭代result更新不更新,完全不影响下一次迭代计算中这两个乘法的进行,所以我们可以把result的加法放到下一次迭代中,这样来看,每一次迭代就是两个乘法和一个加法并行,需要5个周期了,如下图所示。(忽略i的加法)
下面这个表格说明了每次迭代完成后,各个变量的值,其中第0次迭代完表示初始状态
迭代次数 | i | a[i] | tmp | xpwr | result |
---|---|---|---|---|---|
0 | 1 | a 1 a_1 a1 | 0 | x | a 0 a_0 a0 |
1 | 2 | a 2 a_2 a2 | a 1 x a_1x a1x | x 2 x^2 x2 | a 0 a_0 a0 |
2 | 3 | a 3 a_3 a3 | a 2 x 2 a_2x^2 a2x2 | x 3 x^3 x3 | a 0 + a 1 x a_0+a_1x a0+a1x |
3 | 4 | a 4 a_4 a4 | a 3 x 3 a_3x^3 a3x3 | x 4 x^4 x4 | a 0 + a 1 x + a 2 x 2 a_0+a_1x+a_2x^2 a0+a1x+a2x2 |
2、对于5.6来说
result = a[i] + x * result
可以看到x * result的计算是和result有关的,所以一次新迭代的开始必须要等上一次迭代result更新完毕,所以需要先做x * result的乘法,再将结果和a[i]相加,赋给result,需要8个周期。