题目如下:
对多项式求值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