0

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

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

有没有办法替换 if 语句并让编译器能够自动将其优化为 simd 代码?

4

2 回答 2

2

好吧,您可以尝试以下技巧:

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

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

首先,它可能最终仍然无法使用 SIMD。这取决于编译器以及它的聪明程度。

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

第三,如果那您的真实代码,那么 SIMD 对简单计算和最小循环次数(10,000 并不算多)的帮助并不大。

于 2013-09-05T07:57:10.300 回答
0
for(int i=0; i<10000; i++)
{
     a[i] = a[i]<1 ? 0: a[i];
}
于 2013-09-05T10:39:05.327 回答