Я пытался заставить свой старый код работать быстрее, поскольку обнаружил, что процессор RPi 2 поддерживает инструкции NEON. Итак, я написал этот код:
__asm__ __volatile__(
"vld1.8 {%%d2, %%d3}, [%1];"
"vld1.8 {%%d4, %%d5}, [%2];"
"vaba.u8 %%q0, %%q1, %%q2;"
"vst1.64 %%d0, [%0];"
: "=r" (address_sad_intermediary)
: "r" (address_big_pic), "r" (address_small_pic)
:
);
Затем в C основная переменная sad суммируется с sad_intermediary.
Основная цель - вычислить сумму абсолютных разностей, поэтому я загружаю 16 B из big_pic в регистр q1, 16 B из small_pic в регистр q2, вычисляю SAD в q0, а затем загружаю меньшие 8 B из q0 в промежуточную переменную. Проблема в том, что в результате печальный результат равен нулю.
Я использую GCC 4.9.2 с -std = c99 -pthread -O3 -lm -Wall -march = armv7-a -mfpu = neon-vfpv4 -mfloat-abi = hard em > варианты.
Вы видите проблемы с кодом? Спасибо.