深入理解计算机系统第五章,关于每元素周期数(CPE)的计算问题


练习题5.5 题目如下:
对多项式求值a0+a1 x+a2 x^2+...+an*x^n。
代码如下:


 double poly(double a[], double x, int degree)
                      {
                              long int i;
                              double result = a[0];
                              double xpwr = x;
                              for ( i = 1; i <= degree; i++)
                              {
                                      result += a[i] * xpwr;
                                      xpwr = x * xpwr;
                               }
                                return result;
                       }

该题第二问说到,在参考机Core i7上,测量这个函数的CPE等于5.00。
参考答案是这样解释的:限制性能的计算是反复地计算表达式xpwr = x * xpwr。这需要一个双精度浮点数乘法(5个时钟周期),并且直到前一次迭代完成,下一次迭代的计算才能开始。两次连续的迭代之间,对result的更新只需要一个浮点加法(3个时钟周期)。
那我的问题就是,a[i] * xpwr这个代码不应算入对result的更新的时钟周期么?也就是说实际的CPE不应该是5+3么?

计算机原理 深入理解计算机系统

被诅咒的小狐狸 10 years, 9 months ago

两次连续的迭代之间,对result的更新只需要一个浮点加法(3个时钟周期)。

答案已经说的很明白,你理解有误。

对result的更新确实只需要执行语句 result += a[i] * xpwr ,而这个浮点数加法只需要3个时钟周期。

两个连续迭代之间有:两次加法,一次乘法,一次比较。所以两次迭代之间的CPE > 8。

PS:贴代码,请格式化。

力量才是王道 answered 10 years, 9 months ago

Your Answer