2013-09-10 2 views
0

У меня есть буфер 12-битовых данных (хранящихся в 16-битовых данных) и необходимость превращается в 8-бит (сдвиг на 4)NEON ускорения для 12-бит до 8-бит

Как может NEON ускоряет эту обработку?

Спасибо за вашу помощь

Брахим

+0

Это немного сложно, но это можно сделать - что вы пробовали до сих пор? –

ответ

3

Взял на себя смелость предположить несколько вещей, которые описаны ниже, но этот вид кода (не проверялось, может потребоваться несколько модификаций), должны обеспечить хороший прирост скорости по сравнению с наивная версия без NEON:

#include <arm_neon.h> 
#include <stdint.h> 

void convert(const restrict *uint16_t input, // the buffer to convert 
      restrict *uint8_t output,  // the buffer in which to store result 
      int sz) {      // their (common) size 

    /* Assuming the buffer size is a multiple of 8 */ 
    for (int i = 0; i < sz; i += 8) { 
    // Load a vector of 8 16-bit values: 
    uint16x8_t v = vld1q_u16(buf+i); 
    // Shift it by 4 to the right, narrowing it to 8 bit values. 
    uint8x8_t shifted = vshrn_n_u16(v, 4); 
    // Store it in output buffer 
    vst1_u8(output+i, shifted); 
    } 

} 

Вещи я предположил здесь:

  • , что вы работаете с неподписанными значениями. Если это не так, то это будет легко адаптироваться в любом случае (uint* ->int*, *_u8 ->*_s8 и *_u16 ->*_s16)
  • как значения загружаются 8 на 8, я предположил, длина буфера была кратной 8, чтобы избежать случаев краев. Если это не так, то вы должны, вероятно, подушечка искусственно кратный 8.

Наконец, 2 ресурса страница, используемая в документации NEON:

Надеюсь, это поможет!

+1

вам не нужно устанавливать флаг q, если вы не установите флаг r. здесь нечего насыщать. –

+0

Правда, это плохая копия-паста из документации NEON! Починил это. – mbrenon

+0

Спасибо. Я сделаю некоторые тесты. Я пытаюсь включить такой код в приложение Qt 4.8, и мне нужно удалить «const-ограничение». Buf + i был изменен на вход + i. Данные 12-битные без знака в 16-битные и теперь смещены в 8-битные без знака. – bhamadicharef

1
prototype : void dataConvert(void * pDst, void * pSrc, unsigned int count); 
    1: 
    vld1.16 {q8-q9}, [r1]! 
    vld1.16 {q10-q11}, [r1]! 
    vqrshrn.u16 d16, q8, #4 
    vqrshrn.u16 d17, q9, #4 
    vqrshrn.u16 d18, q10, #4 
    vqrshrn.u16 d19, q11, #4 
    vst1.16 {q8-q9}, [r0]! 
    subs r2, #32 
    bgt 1b 

кв флаг: насыщение

г флаг: округление

изменения u16-S16 в случае подписанных данных.