【问题标题】:Optimization of C loopC循环的优化
【发布时间】:2016-10-03 22:46:42
【问题描述】:

我有以下函数来计算系数:

void CalculateCoefficients(LinearFit *DataSet, double *A, double *B)
  {
   /* Declare and initialize sum variables */
   double S_XX = 0.0;
   double S_XY = 0.0;
   double S_X  = 0.0;
   double S_Y  = 0.0;
   int lcv;

   /* Compute the sums */
   for (lcv=0; lcv < DataSet->NextElement; lcv++)
    {
      S_XX += DataSet->Data_X[lcv] * DataSet->Data_X[lcv];
      S_XY += DataSet->Data_X[lcv] * DataSet->Data_Y[lcv];
      S_X  += DataSet->Data_X[lcv];
      S_Y  += DataSet->Data_Y[lcv];
    } /* for() */

   /* Compute the parameters of the line Y = A*X + B */
   (*A) = (((DataSet->NextElement * S_XY) - (S_X * S_Y)) / ((DataSet->NextElement * S_XX) - (S_X * S_X)));
   (*B) = (((S_XX * S_Y) - (S_XY * S_X)) / ((DataSet->NextElement * S_XX) - (S_X * S_X)));
  } /* CalculateCoefficients() */

我正在寻找优化循环。我尝试了循环展开,但效果不大。我还能做什么?

【问题讨论】:

  • 如果您的架构支持,您可以使用 SIMD 指令获得显着的性能提升......如果您不介意计算并行和然后在最后水平添加。它确实改变了添加的顺序,但这仅在更极端的情况下才有意义。如果您有幸选择自己的架构,那么您可能很幸运能够利用一些非常广泛的矢量化指令。

标签: c optimization loop-unrolling


【解决方案1】:

你可以试试:

double dsdx, dsdy;
...
dsdx = DataSet->Data_X[lcv];
dsdy = DataSet->Data_y[lcv];
S_XX += dsdx * dsdx;
S_XY += dsdx * dsdy;
S_X  += dsdx;
S_Y  += dsdy;
...

这样,在循环的每次迭代中,您只能从结构中获取一次值。

【讨论】:

    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 2014-07-30
    • 2017-02-28
    • 2018-12-23
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2015-05-29
    相关资源
    最近更新 更多