【问题标题】:How to optimize and increase efficiency in this particular code involving floating point operation?如何在涉及浮点运算的特定代码中优化和提高效率?
【发布时间】:2012-12-25 16:27:37
【问题描述】:

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

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;
}

【问题讨论】:

  • cin&gt;&gt;b; 优化 FP 操作没有意义
  • 从编译开始——+ = 不应该(大概你打算+=?)
  • 这不是管道停顿。这是一个程序员摊位。
  • 但说真的,“优化”该代码的唯一方法是正确缩进它以使其更具可读性。当你到处都有 IO 时,考虑流水线是绝对没有意义的。
  • 你的代码对向量执行了两个类似 memset 的操作,那么为什么不这样编码呢?

标签: c++ optimization compiler-optimization computer-architecture pipelining


【解决方案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;
}

现在,如果编译器无法unrollvectorize 一两个单级简单循环,那么这些就是你的问题了。去查一下。

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2019-05-31
    相关资源
    最近更新 更多