У меня есть буфер 12-битовых данных (хранящихся в 16-битовых данных) и необходимость превращается в 8-бит (сдвиг на 4)NEON ускорения для 12-бит до 8-бит
Как может NEON ускоряет эту обработку?
Спасибо за вашу помощь
Брахим
У меня есть буфер 12-битовых данных (хранящихся в 16-битовых данных) и необходимость превращается в 8-бит (сдвиг на 4)NEON ускорения для 12-бит до 8-бит
Как может NEON ускоряет эту обработку?
Спасибо за вашу помощь
Брахим
Взял на себя смелость предположить несколько вещей, которые описаны ниже, но этот вид кода (не проверялось, может потребоваться несколько модификаций), должны обеспечить хороший прирост скорости по сравнению с наивная версия без 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
)Наконец, 2 ресурса страница, используемая в документации NEON:
Надеюсь, это поможет!
вам не нужно устанавливать флаг q, если вы не установите флаг r. здесь нечего насыщать. –
Правда, это плохая копия-паста из документации NEON! Починил это. – mbrenon
Спасибо. Я сделаю некоторые тесты. Я пытаюсь включить такой код в приложение Qt 4.8, и мне нужно удалить «const-ограничение». Buf + i был изменен на вход + i. Данные 12-битные без знака в 16-битные и теперь смещены в 8-битные без знака. – bhamadicharef
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 в случае подписанных данных.
Это немного сложно, но это можно сделать - что вы пробовали до сих пор? –