在vs2012中,编译器可以自动将for循环优化为SIMD汇编语句。 但是当if语句在for循环中时,编译器无法对其进行优化, 就像:
for(int i=0; i<10000; i++)
{
if(a[i]<1)
{
a[i]=0;
}
}
有没有办法替代if语句,让编译器能够自动优化 它变成simd代码?
好吧,你可以尝试这样的诡计:
for(int i=0; i<10000; i++)
a[i] = a[i] * (a[i] >= 1);
但是你应该意识到一些事情。
首先,最终可能会仍然无法使用SIMD。这取决于编译器及其聪明程度。
其次,它“可能”最终会变慢,特别是当您对数组中的每个元素执行计算并接触时。这对于示例来说不会太糟糕,但是,如果您的计算更复杂,这可能会引起麻烦。 第三,如果这
是您的真实代码,SIMD 对于简单计算和最小循环计数(10,000 并不算多)来说并没有多大帮助。