быстрый компактный регистр с использованием sse

Я пытаюсь понять, как использовать sse _mm_shuffle_epi8 для сжатия 128-битного регистра.

Допустим, у меня есть входная переменная

__m128i target

который в основном 8 16-бит, обозначается как:

a[0], a[1] ... a[7].  // each slot is 16 bits

мой вывод называется:

__m128i output

Теперь у меня есть бит-вектор размером 8:

char bit_mask // 8 bits, i-th bit each indicate if
// the corresponding a[i] should be included

Хорошо, как я могу получить окончательный результат на основе bit_mask и цели ввода?

Предположим, мой битвектор:

[0 1 1 0 0 0 0 0]

тогда я хочу, чтобы результат был:

output = [a1, a2 , ... ]

Любой известный способ сделать это с помощью _mm_shuffle_epi8?

Предположим, я использую массив поиска:
_mm_shuffle_epi8 (a, mask_lookup [bitvector]);

Как мне создать массив?

1

Решение

Простой и очень быстрый, но требует 4 КБ табличного пространства:

_mm_shuffle_epi8(a, mask_lookup[bitvector]);

где вы просто сохраняете все 256 возможных масок тасования в таблице, индексируемой битовым вектором.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]