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

问题描述 投票:0回答:2

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

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

有没有办法替代if语句,让编译器能够自动优化 它变成simd代码?

c if-statement visual-studio-2012 simd
2个回答
3
投票

好吧,你可以尝试这样的诡计:

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

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

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

其次,它“可能”最终会变慢,特别是当您对数组中的每个元素执行计算并接触时。这对于示例来说不会太糟糕,但是,如果您的计算更复杂,这可能会引起麻烦。 第三,如果这

您的真实代码,SIMD 对于简单计算和最小循环计数(10,000 并不算多)来说并没有多大帮助。


0
投票
	
© www.soinside.com 2019 - 2024. All rights reserved.