Реализация фильтра SSE на С++

Я попытался использовать SSE для работы с 4 пикселями. У меня проблема с загрузкой данных изображения в __m128. Мои данные изображения представляют собой буфер char. Скажем, мое изображение 1024 x1024. Мой фильтр 16x16.

__m128 IMG_VALUES, FIL_VALUES, NEW_VALUES;
//ok:
IMG_VALUES=_mm_load_ps(&pInput[0]);
//hang below:
IMG_VALUES=_mm_load_ps(&pInput[1]);

Я не знаю, как обрабатывать индекс 1,2,3... спасибо.

Ответы

Ответ 1

Если вам действительно нужно сделать это с плавающей точкой, а не целой/фиксированной точкой, тогда вам нужно будет загрузить ваши 8-битные данные, распаковать до 32 бит (требуется две операции: от 8 до 16 бит, затем от 16 бит до 32 бит), а затем преобразовать в float. Однако это ужасно неэффективно, и вы должны смотреть на это, например. 16-битные операции с фиксированной точкой.

Обратите внимание, что для каждой загрузки 16 пикселей у вас будет 4 блока с 4 поплавками x, то есть ваши векторы размером 16 x 8 бит станут 4 x векторами из 4 x поплавков.

Сводка необходимых свойств:

_mm_load_si128(...)       // load 16 x 8 bit values

_mm_unpacklo_epi8(...)    // unpack 8 bit -> 16 bit
_mm_unpackhi_epi8(...)

_mm_unpacklo_epi16(...)   // unpack 16 bit -> 32 bit
_mm_unpackhi_epi16(...)

_mm_cvtepi32_ps(...)      // convert 32 bit int -> float