2013-09-09 12 views
1

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

Скажем, у меня есть входной переменной

__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 

ОК, как я могу получить окончательный результат на основе бит_маски и цели ввода?

считать, мой bitvector является:

[0 1 1 0 0 0 0 0] 

, то я хочу привести быть:

output = [a1, a2 , ... ] 

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

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

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

+0

Итак, вы хотите выбрать, скажем, бит 5 из каждого из 8 ваших 16-битных номеров? –

ответ

4

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

_mm_shuffle_epi8(a, mask_lookup[bitvector]); 

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

+0

+1: иногда грубая сила превосходит элегантность. ;-) –

+0

Как создать массив поиска? Нужно ли вручную создавать это? – WhatABeautifulWorld

+0

@WhatABeautifulWorld: здравомыслящий человек написал бы простую программу для ее создания. –

 Смежные вопросы

  • Нет связанных вопросов^_^