转自http://blog.sina.com.cn/s/blog_7572b5e50101qd2a.html
详细分析:http://www.cnblogs.com/skyivben/archive/2012/05/13/2498222.html
计算多项式a0+a1*x+a2*x^2 + ... + an*x^n
算法1:
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;
}
算法2: a0+x*(a1+x(a2+...+x(an-1+x*an)...))
double polyh(double a[], double x, int degree)
{
long int i;
double result = a[degree];
for ( i = degree - 1; i >= 0; i--)
{
result = a[i] + x*result;
}
return result;
}
result = a[i] + x*result;
假设精度乘法要5个指令周期,加法要3个指令周期.
结论是算法1 CPE=5
算法2 CPE=8
对于算法1,迭代中有两个乘法,分别计算a[i]*xpwr, x*xpwr,因为他们之间没有数据依赖,在多核心的情况下可以并行,所以只要5个指令周期.
再计算result += 的时候,要3个指令周期. 打眼一看,应该要5+3 = 8个指令周期才能完成一次迭代.
但由于有指令流水的存在,只要5个周期就可以了.
在计算完x*xpwr后,就可以开始下一次迭代了.
在 下一轮 迭代计算a[i]*xpwr的时候(5个时钟周期), 上一轮 迭代中 result += 就可以计算结束了;所以(如果流水线满的情况下)大概是5个时钟周期结束一次迭代.
这两种算法根本上的不同就是,第二种算法是以读取result做为一次迭代的开始,以计算并写回result做为一次迭代的结束.这使得两次迭代不能重叠,只能顺序执行.
在 下一轮 迭代计算a[i]*xpwr的时候(5个时钟周期), 上一轮 迭代中
这两种算法根本上的不同就是,第二种算法是以读取result做为一次迭代的开始,以计算并写回result做为一次迭代的结束.这使得两次迭代不能重叠,只能顺序执行.