0
我试图使用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可用于在浮点VAL执行比较,似乎效率不高UE的。
为什么编译器会将比较当作流控制来处理,以及在实现中可以更改哪些内容以便编译器将该向量化为该函数?
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;
}
}
VS 2017似乎。 –
我假设'c_pos'的评估有一个错字。 – Peter
@彼得,哎呀,是的。谢谢。固定! – Gnat