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'
私の質問は次のとおりです。
- VS2012 がベクトル化できるようにこのコードを修正することは可能ですか?
- そうでない場合、コードを自分でベクトル化することは理にかなっていますか?
- SSE2 コーディングについて学ぶための Web サイトを教えてもらえますか?
- ベクトル化が逆効果になる N の値はありますか?
- とは
reason '1105'
?