Изображение сворачивается на руке v7 с использованием неона

Я ищу очень быструю функцию свертки для Raspberry Pi 2, написанную в сборке ARM v7 с неоном (.s или instric).

Если этого не существует (я искал несколько дней), любая помощь в написании этого приветствуется, я начинаю читать руководство неонового программиста, но это очень сложно...

Я попробовал базовую функцию в сборке ARM с аргументом и возвращаемым значением, я могу вызвать ее из C++, чтобы она работала.

Я попробовал базовый тест, переместив данные в неоновый регистр vld1_u8, я могу получить его с vst1_u8, так что заголовок и компилятор в порядке...

Самое сложное для меня - разработать функцию и выбрать правильную инструкцию для ее реализации:

Данные: изображение с серой шкалой 320x240 (8 бит на пиксель со знаком)
Скорость: 20 кадров в секунду
matrix: содержит значения с плавающей запятой от -1 до 1 (базовый без множителя, factor sum = 0, размер 7x7, но может быть расширен с 0 до 8x8)

Я пытаюсь сделать:

  1. Передача памяти в регистр 64 бит:

    uint8x8_t ui88Line1 = vld1_u8 ( Data + 8*0 );
    
  2. Передача данных из 64-разрядного регистра в 128-разрядный с подписью преобразования 8-бит в 16-бит.

    uint16x8_t ui816Kernel1 = vmovl_u8 ( ui88Kernel1 );
    

В остальном я ищу:

  • Нужно ли мне добавлять 255 к моим данным вместо того, чтобы иметь дело с отрицательным значением или использовать конвертировать u16 в s16?
  • Нужно ли применять сдвиг 7 ( * 64) для сохранения точности с плавающей запятой или использовать неоновую реализацию с плавающей запятой?

Мне действительно нужна помощь гуру, чтобы сделать лучший выбор.

Примечание: я уже делаю это на C/C++, OpenCV не оптимизирован для этой платформы.

0 ответов

Другие вопросы по тегам