深入理解计算机习题5.5 解析

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

 1 double poly(double a[], double x, int degree)
 2 {
 3     long int i;
 4     double result = a[0];
 5     double xpwr = x;
 6     for ( i = 1; i <= degree; i++)
 7     {
 8         result += a[i] * xpwr;
 9         xpwr = x * xpwr;
10     }
11     return result;
12 }         


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

这题想了半天,大概是这样: 这个cpu有俩浮点乘法单元,号0,1。其中1号兼备浮点加功能,在5.7.1节有介绍。
第一个循环时并行的话,1号线xpwr1 = x * xpwr0花了5,0号线a[1] * xpwr0花了5,区间时间5。

第二次循环,0号线result1+=花了3;0号线并发执行a[2]*刚得到的xpwr2,花了5;1号线xpwr3 = x * xpwr2花了5;区间时间为5。

第三次循环,0号线result2+=花了3;0号线并发执行a[3]*刚得到的xpwr3,花了5;1号线xpwr4 = x * xpwr3花了5;区间时间5。

以下每次都是这样的5,直到第n次。
第n次循环之后,还有个最后一次的0号result_n+=花了3,可以被忽略掉了.
可如果并发在功能单元中会产生间隔,也就是发射(issue time),result那条线就是4了,不是3。因为0号线上并发的两个计算都依赖上一个循环的结果,只能同时开始或者加法比乘法早进入。于是书上给的解析应该不对吧,虽然结果是对的,或者是还有什么没想到的 因素?可惜这边没环境得到那么精准的测试。

网上没出结果的讨论:

https://bbs.csdn.net/topics/390174670

https://blog.csdn.net/vogel_im_kafig_/article/details/107866006

原文地址:https://www.cnblogs.com/flangrean/p/15247220.html