在 vs2012 中编译器可以自动将 for 循环优化为 SIMD 汇编语句。但是当 if 语句在 for 循环中时,编译器无法对其进行优化,就像:
for(int i=0; i<10000; i++)
{
if(a[i]<1)
{
a[i]=0;
}
}
有没有办法替换 if 语句并让编译器能够自动将其优化为 simd 代码?
在 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 并不算多)的帮助并不大。
for(int i=0; i<10000; i++)
{
a[i] = a[i]<1 ? 0: a[i];
}