A 和 B 是向量或长度 N,其中 N 可以在 20 到 200 的范围内。我想计算这些向量之间距离的平方,即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 编码吗?
- 是否存在某个 N 值,低于该值的矢量化会适得其反?
- 是什么
reason '1105'
?