|
Графический фильтр на Cortex-M7, Увеличение ровно в 2 раза |
|
|
|
Jul 16 2018, 05:35
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Бьюсь над реализацией графического фильтра HQ2X на STM32H743 (Cortex-M7). Фильтр работает, но притормаживает, когда в кадре много мелких деталей. Была предпринята оптимизация: Switch/Case из 256 значений был заменён на JumpTable. Не помогло. Исходный код фильтра (Keil ARM MDK):
HQ2x.rar ( 8.36 килобайт )
Кол-во скачиваний: 21Требуется растянуть кадр в 2 раза по обеим осям. Есть другие фильтры Scale2x, SaI2x , LQ2x - с ними проблем нет, на STM32H743 они идут довольно шустро(написанные на C, без Asm-а). Вот тут чувак заточил под NEON и DSP фильтр HQnX (что не годится для Cortex-M7): https://pyra-handheld.com/boards/threads/ru...sp.69047/page-5Существуют ли аналогичные графические фильтры (в частности HQ 2x), оптимизированные на ассемблере для ядер ARM Cortex-M7? Работа фильтра пояснена на рисунке:
Сообщение отредактировал __inline__ - Jul 16 2018, 05:37
|
|
|
|
|
 |
Ответов
|
Jul 16 2018, 06:12
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
А попорбовать вместо ассемблерных вставок (которые обычно сбивают оптимизатор) использовть встроенные инлайны компилятора? В случае GCC, к примеру, могут оптимизатором варьироваться регистры, содержащие исходные значения/результаты... Кстати, сравнение для четырех восьмибитных чисел должно быть тоже в SIMD... скорее всего. Вы его делаете "в ручную". Код Searching for 'SSUB8'... C:\USER\SVN\CMSIS_5-5.3.0\CMSIS\Core\Include\cmsis_armcc.h(803):#define __SSUB8 __ssub8 C:\USER\SVN\CMSIS_5-5.3.0\CMSIS\Core\Include\cmsis_armclang.h(1381):__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) C:\USER\SVN\CMSIS_5-5.3.0\CMSIS\Core\Include\cmsis_armclang.h(1385): __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); C:\USER\SVN\CMSIS_5-5.3.0\CMSIS\Core\Include\cmsis_gcc.h(1590):__STATIC_FORCEINLINE uint32_t __SSUB8(uint32_t op1, uint32_t op2) C:\USER\SVN\CMSIS_5-5.3.0\CMSIS\Core\Include\cmsis_gcc.h(1594): __ASM volatile ("ssub8 %0, %1, %2" : "=r" (result) : "r" (op1), "r" (op2) ); C:\USER\SVN\CMSIS_5-5.3.0\CMSIS\Core\Include\cmsis_iccarm.h(397): #define __SSUB8 __iar_builtin_SSUB8 C:\USER\SVN\CMSIS_5-5.3.0\CMSIS\Core_A\Include\cmsis_iccarm.h(310): #define __SSUB8 __iar_builtin_SSUB8 7 occurrence(s) have been found. И самый главный вопрос - DATA CACHE включен в процессоре?
Сообщение отредактировал Genadi Zawidowski - Jul 16 2018, 06:18
|
|
|
|
|
Jul 16 2018, 07:49
|

Местный
  
Группа: Участник
Сообщений: 257
Регистрация: 5-09-17
Пользователь №: 99 126

|
Цитата(Genadi Zawidowski @ Jul 16 2018, 07:12)  А попорбовать вместо ассемблерных вставок (которые обычно сбивают оптимизатор) использовть встроенные инлайны компилятора? В случае GCC, к примеру, могут оптимизатором варьироваться регистры, содержащие исходные значения/результаты... Кстати, сравнение для четырех восьмибитных чисел должно быть тоже в SIMD... скорее всего. Вы его делаете "в ручную". Наскоряк не нашёл CMSIS-овский хедер, поэтому на ассемблере написал. Попробуем использовать инлайны. Цитата(Genadi Zawidowski @ Jul 16 2018, 07:12)  И самый главный вопрос - DATA CACHE включен в процессоре? Да. Без него всё очень сильно медленно.
|
|
|
|
Сообщений в этой теме
__inline__ Графический фильтр на Cortex-M7 Jul 16 2018, 05:35 ViKo Рисунок врет. Например, глаза лягушонка он размыл ... Jul 16 2018, 07:26 aaarrr Цитата(ViKo @ Jul 16 2018, 10:26) Рисунок... Jul 16 2018, 07:49  ViKo Цитата(aaarrr @ Jul 16 2018, 10:49) Прост... Jul 16 2018, 07:54 __inline__ Цитата(ViKo @ Jul 16 2018, 08:26) Рисунок... Jul 16 2018, 07:54  KnightIgor Цитата(__inline__ @ Jul 16 2018, 08:54) Н... Jul 16 2018, 11:54   __inline__ Цитата(KnightIgor @ Jul 16 2018, 12:54) О... Jul 21 2018, 09:26    Arlleex Цитата(__inline__ @ Jul 21 2018, 12:26) В... Jul 21 2018, 10:13     __inline__ Цитата(Arlleex @ Jul 21 2018, 11:13) А за... Jul 21 2018, 10:41 Genadi Zawidowski CMSIS обычно подключен через соответствующий проце... Jul 16 2018, 07:53 jcxz Цитата(__inline__ @ Jul 16 2018, 08:35) Б... Jul 16 2018, 08:00 __inline__ Цитата(jcxz @ Jul 16 2018, 09:00) Уже пис... Jul 16 2018, 08:07  jcxz Цитата(__inline__ @ Jul 16 2018, 11:07) П... Jul 16 2018, 08:17 AVI-crak Цитата(__inline__ @ Jul 16 2018, 11:35) В... Jul 16 2018, 08:35 Genadi Zawidowski Там тоже ассемблер с "неоном". Неон умее... Jul 16 2018, 08:39 jcxz Я так понимаю - Вы сами пытались оптимизировать фу... Jul 16 2018, 08:50  __inline__ Цитата(jcxz @ Jul 16 2018, 09:50) Я так п... Jul 16 2018, 14:54 Obam Т.к. кортекс-М умеет только команды Tumb-2, то заг... Jul 16 2018, 15:52 __inline__ Цитата(Obam @ Jul 16 2018, 16:52) Т.к. ко... Jul 16 2018, 16:21  jcxz Цитата(__inline__ @ Jul 16 2018, 19:21) Ч... Jul 16 2018, 18:30  jcxz Кстати - по этой найденной Вами ассемблерной Diff(... Jul 17 2018, 06:17   __inline__ Цитата(jcxz @ Jul 17 2018, 07:17) Кстати ... Jul 17 2018, 11:11    jcxz Цитата(__inline__ @ Jul 17 2018, 14:11) Е... Jul 17 2018, 15:59     __inline__ Цитата(jcxz @ Jul 17 2018, 16:59) Код in... Jul 18 2018, 03:03      jcxz Цитата(__inline__ @ Jul 18 2018, 06:03) П... Jul 18 2018, 08:57       __inline__ Цитата(jcxz @ Jul 18 2018, 09:57) Я вообщ... Jul 21 2018, 02:38 __inline__ Проделал несколько экспериментов.
1) Переписал Di... Jul 17 2018, 09:01 AVI-crak Цитата(__inline__ @ Jul 17 2018, 15:01) 3... Jul 17 2018, 15:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|