2

関数電卓を使用しています。そして、可能であれば少し改善したいと思います。アンプでコードを確認します。最も時間のかかる(頻繁に使用される)コードは次のとおりです。

double a = 0.0;
for(j = 0; j < n; j++) a += w[j]*fi[((index[j] + i)<<ldf) + k];

私にとっては、wとfiの内積にすぎません。不思議なんだけど:

  1. インテル®コンパイラーはそれを自動的に行いますか?(つまり、ループを2つのベクトル化された配列の内積として扱いました。)
  2. コードを改善する方法はありますか?(つまり、wと同じサイズの別の配列a1を定義することを意味します。そうすれば、乗算されたすべての数値をa1に格納できます(展開されたループ?)。最後に合計を行います。)
  3. 他の提案?

VisualStudioでParallelComposer2013を使用しています。どんなアイデアでも評価されます!:)

4

1 に答える 1

2

k配列内で常に固定量だけオフセットしていることに気付くことから始めることができますfi...私はそれがタイプであると仮定していdouble*ます。kでは、ループする前に一度だけオフセットしてみませんか?

double *fik = fi + k;

実際、 で同じことを行いますi。値(index[j] + i) << ldfは に相当し(index[j] << ldf) + (i << ldf)ます。したがって、次のようになります。

double *fik = fi + k + (i << ldf);
double a = 0.0;
for(j = 0; j < n; j++) a += w[j] * fik[ index[j]<<ldf ];

コンパイラがすでにそれを行うことを決定していない限り、少し速くなるはずです。

于 2012-10-03T03:09:25.607 に答える