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

ここで、コンパイラーが単一レベルの単純なループを 1 つまたは 2 つ展開してベクトル化できない場合は、それが問題です。それらを調べに行きます。

于 2013-01-11T07:30:07.767 に答える