如何避免if语句?对于编译器无法将其优化为simd

时间:2013-09-05 07:46:27

标签: c visual-studio-2012 if-statement compiler-construction simd

在vs2012中,编译器可以自动将for循环优化为SIMD汇编语句。 但是当一个if语句在for循环中时,编译器无法对其进行优化, 就像:

for(int i=0; i<10000; i++)
{
    if(a[i]<1)
    {
        a[i]=0;
    }
}

无论如何都要替换if语句并让编译器能够自动优化 它变成了simd代码?

2 个答案:

答案 0 :(得分:2)

嗯,你可以尝试欺骗,如:

for(int i=0; i<10000; i++)
    a[i] = a[i] * (a[i] >= 1);

但你应该意识到一些事情。

首先,它可能无法使用SIMD。这取决于编译器以及它可能有多聪明。

其次,可能最终会变慢,尤其是因为您正在对数组中的每个元素执行计算和触摸。对于样本来说这不会太糟糕,但如果你的计算更复杂,那可能会带来麻烦。

第三,如果 是你的真实代码,那么SIMD对于简单的计算和最小的循环计数(10,000不是那么多)实际上并没有那么多帮助。

答案 1 :(得分:0)

for(int i=0; i<10000; i++)
{
     a[i] = a[i]<1 ? 0: a[i];
}