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 を使用できなくなる可能性があります。それは、コンパイラと、それがどれほど賢いかによって異なります。

第二に、特に配列内のすべての要素に対して計算を実行し、それに触れるため、遅くなる可能性があります。これはサンプルにとってそれほど悪いことではありませんが、計算がより複雑になると、問題が発生する可能性があります。

第 3 に、それ実際のコードである場合、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 に答える