Быстрый компактный регистр с использованием 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 возможных масок тасования в таблице, индексируемой битовым вектором.

Другие вопросы по тегам