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