реклама на сайте
подробности

 
 
> Ассемблерная оптимизация маленького куска (порядка 10-15 инструкций)
Himmler
сообщение Feb 26 2016, 14:46
Сообщение #1


Участник
*

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



Здравствуйте, товарищи.

Имеется старенький arm926, на нём потребовалось запилить определённый алгоритм.

Основная тяжеловесная часть данного алгоритма делают следующее:

На входе - 32-битное слово (лежит в регистре R0), в памяти (время доступа - 1 такт) лежат 4 таблицы по 256 однобайтовых элементов каждая.

-Выковыриваем из входного слова отдельно все 4 байта
-Из таблицы 1 дёргаем байт, позиция которого определяется первым выдернутым байтом входного слова
-Из таблицы 2 дёргаем байт, позиция которого определяется вторым выдернутым байтом входного слова
-Из таблицы 3 дёргаем байт, позиция которого определяется третьим выдернутым байтом входного слова
-Из таблицы 4 дёргаем байт, позиция которого определяется четвёртым выдернутым байтом входного слова
-Из четырёх надёрганных байтов формируем выходное 32-битное слово

Реализация в лоб занимает у меня 11 команд (4 логических И с маской, затем 4 загрузки из таблиц в регистры, затем 3 сложения, чтобы получить выходное слово. Сдвиги не учитываю, так как они прилеплены к другим командам и даются "бесплатно")

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

Очень надеюсь, что есть опытные сограждане.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Himmler
сообщение Mar 3 2016, 16:38
Сообщение #2


Участник
*

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



Сегодня начал мерить производительность кода и познакомился с кучей неприятных сюрпризов архитектуры ARM.

Во-первых блокировка при загрузке байт/слов составляет не один такт, а два.
Во-вторых все сдвиги, прилепленные к командам, совсем не бесплатные, и тоже добавляют блокировку на использование сдвигаемого регистра на один такт.

Возможно, есть что-то ещё, и в результате приведённый мной выше код работает правильно, но в два раза дольше, чем я ожидал.

Единственное, что сразу пришло на ум и чуть-чуть ускорило выполнение - перенос одной команды загрузки слова на пораньше. Но особой погоды это не сделало.

Поэтому актуален следующий вопрос:

Как можно изменить код (в том числе с добавлением команд и расходованием доп. регистров), чтобы уменьшить именно количество тактов при выполнении ?
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Mar 4 2016, 14:41
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(Himmler @ Mar 3 2016, 23:38) *
Сегодня начал мерить производительность кода и познакомился с кучей неприятных сюрпризов архитектуры ARM.


Это наверное ваша команда чтения из памяти виновата LDRB R3, [R6, R0, LSR #24]
У старенького arm926 - ядро ARM7TDMI, и его команды имеют чёткое описание
http://www.gaw.ru/html.cgi/txt/doc/micros/...tmi/insruct.htm

Формат чтения памяти : [Rn, +/-Rm, LSR #5bit_shift_imm] , но в реальности LSR-LSL - это пятый бит смещения, а нулевой бит просто не участвует в операции - и того 3 бита смещения. То-есть как у всех ARM чипов.

Go to the top of the page
 
+Quote Post
scifi
сообщение Mar 4 2016, 14:51
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(AVI-crak @ Mar 4 2016, 17:41) *
У старенького arm926 - ядро ARM7TDMI

Это что-то новенькое cranky.gif

Цитата(AVI-crak @ Mar 4 2016, 17:41) *
и его команды имеют чёткое описание

Да. См. тут.
Go to the top of the page
 
+Quote Post
AVI-crak
сообщение Mar 4 2016, 15:14
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Цитата(scifi @ Mar 4 2016, 21:51) *
Это что-то новенькое cranky.gif


Да. См. тут.


А тут значится ложная инфа ? https://www.arm.com/products/processors/cla...arm9/arm926.php

И тут. https://www.arm.com/products/processors/cla...arm9/arm926.php, заявлена двоичная совместимость с ядром ARM7TDMI.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Himmler   Ассемблерная оптимизация маленького куска (порядка 10-15 инструкций)   Feb 26 2016, 14:46
- - scifi   Может быть, можно сделать 4 байтовые загрузки в ст...   Feb 26 2016, 15:15
- - jcxz   Цитата(Himmler @ Feb 26 2016, 20:46) На в...   Feb 26 2016, 15:22
|- - ar__systems   Цитата(jcxz @ Feb 26 2016, 10:22) PS: Тол...   Feb 26 2016, 16:28
- - 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
|- - Obam   Цитата(Himmler @ Mar 3 2016, 20:38) Сегод...   Mar 4 2016, 09:13
|- - AlexRayne   Цитата(Himmler @ Mar 3 2016, 19:38) Сегод...   Mar 4 2016, 09:37
|- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 02:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016