Я довольно новичок в программировании ARM и NEON, мне поручена задача оптимизации функции SAD (Sum of Absolute Difference). Я не знаю, с чего начать, я попробовал несколько способов создания кода NEON без успеха. Последовательная функция выглядит следующим образом:Операция ARM NEON 8x8 SAD
void sad_block_8x8(uint8_t *block1, uint8_t *block2, int stride, int *result)
{
int u, v;
*result = 0;
for (v = 0; v < 8; ++v)
{
for (u = 0; u < 8; ++u)
{
*result += abs(block2[v*stride+u] - block1[v*stride+u]);
}
}
}
Так что моя проблема заключается:
- Как загрузить регистры для каждой итерации
- как мне делать вычисления и хранить его в переменный результате
Любая помощь будет очень признательна!
хорошо ... так что моя первая попытка была что-то вроде этого (который работает, но я знаю, что это очень плохо неон код)
void sad_block_8x8_2(uint8_t *block1, uint8_t *block2, int stride, int *result)
{
int u, v;
uint8x8_t m_1, m_2, m_o;
uint8_t* test;
test = (uint8_t*)malloc(v*u*sizeof(uint8_t));;
*result = 0;
for (v = 0; v < 8; ++v)
{
for(u = 0; u < 8; ++u)
{
m_1 = vld1_u8(&block1[v*stride]);
m_2 = vld1_u8(&block2[v*stride]);
m_o = vabd_u8(m_2, m_1);
vst1_u8(&test[v], m_o);
//printf("%d ", test[v]);
*result += (int)test[v];
}
}
}
любая помощь, пожалуйста?
Блоки входных данных должны быть 'const'. Вы попробовали компилятор NEON, способный авто-векторизовать для вас? – unwind
Для получения 8x8 - 8x1 вы можете использовать 'uint16x8_t vabal_u8 (uint16x8_t, uint8x8_t, uint8x8_t)' в arm_neon.h – user3528438