|
Ассемблерная оптимизация маленького куска (порядка 10-15 инструкций) |
|
|
|
Feb 26 2016, 14:46
|
Участник

Группа: Участник
Сообщений: 17
Регистрация: 24-06-11
Пользователь №: 65 868

|
Здравствуйте, товарищи.
Имеется старенький arm926, на нём потребовалось запилить определённый алгоритм.
Основная тяжеловесная часть данного алгоритма делают следующее:
На входе - 32-битное слово (лежит в регистре R0), в памяти (время доступа - 1 такт) лежат 4 таблицы по 256 однобайтовых элементов каждая.
-Выковыриваем из входного слова отдельно все 4 байта -Из таблицы 1 дёргаем байт, позиция которого определяется первым выдернутым байтом входного слова -Из таблицы 2 дёргаем байт, позиция которого определяется вторым выдернутым байтом входного слова -Из таблицы 3 дёргаем байт, позиция которого определяется третьим выдернутым байтом входного слова -Из таблицы 4 дёргаем байт, позиция которого определяется четвёртым выдернутым байтом входного слова -Из четырёх надёрганных байтов формируем выходное 32-битное слово
Реализация в лоб занимает у меня 11 команд (4 логических И с маской, затем 4 загрузки из таблиц в регистры, затем 3 сложения, чтобы получить выходное слово. Сдвиги не учитываю, так как они прилеплены к другим командам и даются "бесплатно")
Есть ли предложения по сокращению количества команд, если алгоритмическая оптимизация недоступна (то есть только грамотным подбором ассемблерных инструкций) ?
Очень надеюсь, что есть опытные сограждане.
|
|
|
|
|
 |
Ответов
|
Feb 26 2016, 15:22
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Himmler @ Feb 26 2016, 20:46)  На входе - 32-битное слово (лежит в регистре R0), в памяти (время доступа - 1 такт) лежат 4 таблицы по 256 однобайтовых элементов каждая.
-Выковыриваем из входного слова отдельно все 4 байта -Из таблицы 1 дёргаем байт, позиция которого определяется первым выдернутым байтом входного слова -Из таблицы 2 дёргаем байт, позиция которого определяется вторым выдернутым байтом входного слова -Из таблицы 3 дёргаем байт, позиция которого определяется третьим выдернутым байтом входного слова -Из таблицы 4 дёргаем байт, позиция которого определяется четвёртым выдернутым байтом входного слова -Из четырёх надёрганных байтов формируем выходное 32-битное слово Просто поразительно как Ваша задача напоминает решение задачи изложенной только что, практически одновременно с Вами в этом посте: http://electronix.ru/forum/index.php?showt...p;#entry1407211Правда там нужны таблицы не байтовые, а состоящий из 32-битных слов, и ядро другое - M0. Но всё-же, всё-же..... очень подозрительно.....  Касательно сути проблемы: Вы не озвучили требования по памяти. Тупо в лоб оптимизация за счёт объёма памяти: разбивать входное 32-бит слово не на байты, а на куски большей разрядности - например 11/11/10 бит; ну или 16/16бит. Памяти израсходуете больше, но тактов - меньше. PS: Только что в голову пришёл самый быстрый метод - в зависимости от функционирования GPIO в Вашем МК, этот метод вообще может занимать всего пару тактов Выделяете 2-а 32-битных порта GPIO. Соединяете вых. линии первого порта с вх. линиями второго в соответствии с таблицей перестановки бит, выводите слово в первый порт, считываете со второго. На ядре M3 этот алгоритм может занимать всего два такта, если GPIO сидит на быстрой шине.
|
|
|
|
|
Feb 26 2016, 16:28
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(jcxz @ Feb 26 2016, 10:22)  PS: Только что в голову пришёл самый быстрый метод - в зависимости от функционирования GPIO в Вашем МК, этот метод вообще может занимать всего пару тактов Выделяете 2-а 32-битных порта GPIO. Соединяете вых. линии первого порта с вх. линиями второго в соответствии с таблицей перестановки бит, выводите слово в первый порт, считываете со второго. На ядре M3 этот алгоритм может занимать всего два такта, если GPIO сидит на быстрой шине. Тут не перестановка битов, а выборка из массива. Смотря что у вас там за доступы, может помочь кэширование результатов.
|
|
|
|
Сообщений в этой теме
Himmler Ассемблерная оптимизация маленького куска (порядка 10-15 инструкций) Feb 26 2016, 14:46 scifi Может быть, можно сделать 4 байтовые загрузки в ст... Feb 26 2016, 15:15 Himmler Дело в том, что расширить таблицы мне уже не удас... Feb 26 2016, 16:58 jcxz Цитата(Himmler @ Feb 26 2016, 22:58) Дело... Feb 26 2016, 18:56 Himmler В принципе да, я могу уместиться в память, если пе... Feb 26 2016, 19:32 controller_m30 Можно в 9 команд уложиться.
В R0 исходное слово 32... Feb 26 2016, 20:09 adnega Цитата(controller_m30 @ Feb 26 2016, 23:0... Feb 26 2016, 20:13 Ga_ry Если организовать результирующее слово как структу... Feb 26 2016, 20:24 Himmler Действительно, я наверное некорректно в постановке... Feb 26 2016, 20:29 controller_m30 Цитата(Himmler @ Feb 26 2016, 23:29) А бо... Feb 26 2016, 21:15 Himmler Цитата(controller_m30 @ Feb 27 2016, 01:1... Feb 26 2016, 21:51 AVI-crak Не понимаю как у вас получается 9 команд, и 18 в у... Feb 26 2016, 23:36 Himmler Цитата(AVI-crak @ Feb 27 2016, 03:36... Feb 27 2016, 07:41 jcxz Цитата(Himmler @ Feb 27 2016, 13:41) Прим... Feb 27 2016, 07:57 Himmler В моём случае не принципиально 10 килобайт или 16,... Feb 27 2016, 08:20 jcxz Вы упорно пишете LDR, хотя Вам надо грузить 16-бит... Feb 27 2016, 08:25 Himmler Опять же согласен, вгружать 32-битные слова неправ... Feb 27 2016, 08:32 AVI-crak LDRB R3, [R6, R0, LSR #24] - это наверное из друго... Feb 28 2016, 00:15 Himmler К сожалению прямо сейчас у меня железяки и полноце... Feb 28 2016, 11:33 Himmler Извиняюсь за задержку, сегодня проверил код, погон... Mar 2 2016, 18:16 jcxz Цитата(Himmler @ Mar 3 2016, 00:16) Погля... Mar 7 2016, 07:45 Himmler Сегодня начал мерить производительность кода и поз... Mar 3 2016, 16:38 Obam Цитата(Himmler @ Mar 3 2016, 20:38) Сегод... Mar 4 2016, 09:13 AlexRayne Цитата(Himmler @ Mar 3 2016, 19:38) Сегод... Mar 4 2016, 09:37 AVI-crak Цитата(Himmler @ Mar 3 2016, 23:38) Сегод... Mar 4 2016, 14:41  scifi Цитата(AVI-crak @ Mar 4 2016, 17:41)... Mar 4 2016, 14:51   AVI-crak Цитата(scifi @ Mar 4 2016, 21:51) Это что... Mar 4 2016, 15:14    scifi Цитата(AVI-crak @ Mar 4 2016, 18:14)... Mar 4 2016, 15:22    _pv Цитата(AVI-crak @ Mar 4 2016, 21:14)... Mar 4 2016, 15:30 Himmler Дело в том, что у меня и так линейный код, без вет... Mar 4 2016, 18:06 Himmler Ну про перенос команды загрузки я ранее уже писал,... Mar 7 2016, 07:58 jcxz Вы не поняли....
Вот описание команды LDRH ядр... Mar 8 2016, 09:37 Himmler Точно, неплохая идея. Даже один сэкономленный реги... Mar 8 2016, 09:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|