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 を使用できなくなる可能性があります。それは、コンパイラと、それがどれほど賢いかによって異なります。
第二に、特に配列内のすべての要素に対して計算を実行し、それに触れるため、遅くなる可能性があります。これはサンプルにとってそれほど悪いことではありませんが、計算がより複雑になると、問題が発生する可能性があります。
第 3 に、それが実際のコードである場合、SIMD は、単純な計算と最小限のループ数 (10,000 は実際にはそれほど多くない) にはあまり役に立ちません。
for(int i=0; i<10000; i++)
{
a[i] = a[i]<1 ? 0: a[i];
}