我正在尝试使用Visual C ++ 2013自动矢量化器来进行以下循环矢量化(/arch:AVX2
),但编译器拒绝并提供以下消息:
info C5002: loop not vectorized due to reason '1100'
此reason code表示
Loop contains control flow—for example, "if" or "?".
我试图将比较和最终赋值拆分为一个单独的循环,但是当intrinsics可用于对浮点值进行比较时,这似乎效率低下。
为什么编译器会将比较视为流控制,我可以在实现中更改哪些内容以便编译器对该函数进行矢量化?
void triplets_positive(
const std::uint64_t count,
double * const a,
double * const b,
double * const c,
std::uint64_t * const all_positive)
{
for (std::uint64_t i = 0; i < count; ++i)
{
// These >= operations make the loop not vectorisable because
// they introduce control flow.
std::uint64_t a_pos = (a[i] >= 0.0);
std::uint64_t b_pos = (b[i] >= 0.0);
std::uint64_t c_pos = (c[i] >= 0.0);
all_positive[i] = a_pos & b_pos & c_pos;
}
}