2017-07-27 45 views
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; 
    } 
} 
+0

VS 2017似乎。 –

+0

我假设'c_pos'的评估有一个错字。 – Peter

+0

@彼得,哎呀,是的。谢谢。固定! – Gnat

回答

0

不幸的是,这似乎是Visual C++ 2013编译器中的一个错误或限制。其他编译器使用CMPPD指令(AVX/AVX2)或CMP*PD指令(SSE2)。

编译器成功地vectorise此循环包括:

  • 的Visual C++ 2017
  • 的Visual C++ 2015
  • 锵+ LLVM(Apple LLVM version 8.1.0 (clang-802.0.42)

虽然这是理论上有可能写入的比较作为按位操作,这是适得其反的,最好的选择是升级到另一个编译器。