浅谈优化程序性能

来源:互联网 发布:nba2k13捏脸详细数据 编辑:程序博客网 时间:2024/05/18 16:19

转自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 1; <= degree; i++)
                                      {
                                              result += a[i] xpwr;
                                              xpwr 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 = degree - 1; i >= 0; i--)
                                      {
                         result = a[i] + x*result;
                                       }
                                        return 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做为一次迭代的结束.这使得两次迭代不能重叠,只能顺序执行.
0 0
原创粉丝点击