私はSSE組み込み関数を使用して小さなコードを最適化しようとしています(私はこのトピックの完全な初心者です)が、条件の使用に少し固執しています。
私の元のコードは次のとおりです。
unsigned long c;
unsigned long constant = 0x12345678;
unsigned long table[256];
int n, k;
for( n = 0; n < 256; n++ )
{
c = n;
for( k = 0; k < 8; k++ )
{
if( c & 1 ) c = constant ^ (c >> 1);
else c >>= 1;
}
table[n] = c;
}
このコードの目的は、crcテーブルを計算することです(定数は任意の多項式にすることができ、ここでは役割を果たしません)、
最適化されたコードは次のようになると思います。
__m128 x;
__m128 y;
__m128 *table;
x = _mm_set_ps(3, 2, 1, 0);
y = _mm_set_ps(3, 2, 1, 0);
//offset for incrementation
offset = _mm_set1_ps(4);
for( n = 0; n < 64; n++ )
{
y = x;
for( k = 0; k < 8; k++ )
{
//if do something with y
//else do something with y
}
table[n] = y;
x = _mm_add_epi32 (x, offset);
}
if-elseステートメントをどのように処理するかはわかりませんが、巧妙なトリックがあるのではないかと思います。誰かがそれを行う方法についてのアイデアを持っていますか?
(これを除けば、私の最適化はおそらくかなり貧弱です-それに関するアドバイスや修正は最大の共感で扱われます)