考虑下面的计算n个双精度数组成的数组乘积的函数。我们3次展开这个循环。
double aprod(double a[], long n) [ long i; double x,y, z; double r = 1; for (i = 0;1< n-2;1+=3) { x=a[i]; y = a[i+1]; z=a[i+2]; r=r*x*y*z; /*Product computation */ } for (;i < n; i++) r *=a[i] ; return r; }
对于标记为Product computation的行,可以用括号得到该计算的五种不同的结合,如下所示:
r=((r*x)*y)*z; /*A1*/ r=(r*(x*y))*z; /*A2*/ r=r*((x*y)*z); /*A3*/ r=r*(x*(y*z)); /*A4*/ r=(r*x)*(y*z); /*A5*/
假设在一台浮点数乘法延迟为5个时钟周期的机器上运行这些函数。确定由乘法的数据相关限定的CPE的下界。(提示:画出每次迭代如何计算r的图形化表示会所帮助。》