4

A と B はベクトルまたは長さ N であり、N は 20 から 200 の範囲にある可能性があります。これらのベクトル間の距離の 2 乗、つまり d^2 = ||AB||^2 を計算したいと考えています。

これまでのところ、私は持っています:

float* a = ...;
float* b = ...;
float d2 = 0;

for(int k = 0; k < N; ++k)
{
    float d = a[k] - b[k];
    d2 += d * d;
}

コードをプロファイリングしたことと、これがボトルネックであることを除いて、これは問題なく動作しているようです (50% 以上の時間がこれだけに費やされています)。Win 7 で Visual Studio 2012 を使用しています。最適化オプションは次のとおり/O2 /Oi /Ot /Oy-です。私の理解では、VS2012 はそのループを (SSE2 を使用して) 自動ベクトル化する必要があります。ただし#pragma loop(no_vector)、コードを挿入しても、顕著な速度低下は見られないため、ループがベクトル化されていないと推測されます。コンパイラは、次のメッセージでそれを確認します。

  info C5002: loop not vectorized due to reason '1105'

私の質問は次のとおりです。

  1. VS2012 がベクトル化できるようにこのコードを修正することは可能ですか?
  2. そうでない場合、コードを自分でベクトル化することは理にかなっていますか?
  3. SSE2 コーディングについて学ぶための Web サイトを教えてもらえますか?
  4. ベクトル化が逆効果になる N の値はありますか?
  5. とはreason '1105'?
4

2 に答える 2

4

MSDN ドキュメントによると、エラー コード 1105 は、コンパイラがコードをベクトル化された命令に縮小する方法を理解できないことを意味します。浮動小数点演算の場合、浮動小数点の縮小を有効にするには /fp:fast オプションを指定する必要があることが示されています。

于 2013-06-09T01:16:58.120 に答える