Я пытаюсь оптимизировать небольшой фрагмент кода с помощью встроенных функций 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, но подозреваю, что это хитрый трюк. Есть ли у кого-нибудь идеи, как это сделать?
(Помимо этого, моя оптимизация, вероятно, довольно плохая - любые советы или исправления будут восприняты с большим сочувствием)