0

我们知道浮点运算有很高的延迟并且需要很多时钟周期来执行,这可能会导致流水线停止!优化以下代码的不同方法是什么。

int main()

{

 float fsum[50],a=10.45;

 int isum[100],b=20;

 for(int i=0;i<100;i++)
   {

       if(i<50) 
           {
             fsum[i] = a*a;
           }
       isum[i] = b*b

   }
return 0;
}
4

1 回答 1

1

如果,无论出于何种原因,您的编译器不能被信任表现出基本的优化能力,并且它生成的代码运行的性能低于您基于机器限制的预期(您正在测量性能,并且您知道这些限制,对吗?) ,然后您可以开始手动优化:

提升循环外的循环不变计算:

int main()
{
  float fsum[50],a=10.45;
  float aa = a * a;
  int isum[100],b=20;
  int bb = b * b;

  for(int i=0;i<100;i++)
  {
    if(i<50) {
         fsum[i] = aa;
    }
    isum[i] = bb;
  }

  return 0;
}

拆分循环,并设置边界以匹配封闭的条件

int main()
{
  float fsum[50],a=10.45;
  float aa = a * a;
  int isum[100],b=20;
  int bb = b * b;

  for(int i=0; i < 50; i++)
  {
    fsum[i] = aa;
  }

  for(int i=0;i<100;i++)
  {
    isum[i] = bb;
  }

  return 0;
}

现在,如果编译器无法展开矢量化一个或两个单级简单循环,那么这些就是你的问题。去看看他们。

于 2013-01-11T07:30:07.767 回答