【发布时间】:2013-06-04 17:26:19
【问题描述】:
A 和 B 是向量或长度 N,其中 N 可以在 20 到 200 的范围内。 我想计算这些向量之间距离的平方, 即 d^2 = ||A-B||^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'?
【问题讨论】:
标签: c++ visual-c++ optimization vectorization sse2