在vs2012中,编译器可以自动将for循环优化为SIMD汇编语句。 但是当一个if语句在for循环中时,编译器无法对其进行优化, 就像:
for(int i=0; i<10000; i++)
{
if(a[i]<1)
{
a[i]=0;
}
}
无论如何都要替换if语句并让编译器能够自动优化 它变成了simd代码?
答案 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];
}