|
asm на AVR, оптимальные конструкции |
|
|
|
Feb 5 2012, 18:34
|
Местный
  
Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023

|
Цитата(=GM= @ Feb 3 2012, 11:53)  Ещё вот подумал об использовании фиксированной точки по сравнению с плавающей. В большинстве практических задач известен диапазон обрабатываемых величин и, как ни странно, диапазон не такой уж большой. Если взять к примеру 40-битную фиксированную точку, то диапазон предcтавимых чисел составит 240 дБ. Можно с Сатурна сообщения обрабатывать :-). В то же время быстродействие обработки фиксточки на порядок выше по сравнению с плавающей. Так что, стоит покумекать и принормировать свою задачу к определенному диапазону. В плавучке мантисса занимает 23 бита плюс один не хранимый всегда равный 1. Итого 3 байта. Чтобы перемножить два числа нужно перемножить мантиссы. AVR выполняет умножение байт на байт за одну команду, чтобы перемножить два 3-байтовых числа нужно 9 команд умножения. И порядки сложить. В плавучке вычисление spline = ds + tmp * (cs + tmp * (bs + as*tmp)); - то есть 6 операций - занимает 860 тактов (см ссылку выше в теме). то есть 146 тактов на операцию. А чтобы перемножить два 40 битных числа с фиксированной точкой, то есть 5 байтных, нужно 25 команд умножения. Каждая команда умножения даёт два байта результата, которые нужно прибавить к промежуточному результату (для всех кроме 5 первых умножений). То есть нужно почти в 2 раза больше команд сложения ещё, 40 штук вроде. Итого уже 25*2+40*1=90 тактов. Это без учёта пересылок, вызова функций и т.д. Таким образом 40 битная фиксированная точка может оказаться и вовсе не быстрее плавучки. И по крайней мере не на порядок быстрее. Цитата(_Ivana @ Jan 30 2012, 18:48)  я и так вынужден хранить в плавучке только дробные части чисел а целые - в отдельных байтах, чтобы не терять абсолютную точность! Выглядит сомнительно. Плавучка не теряет точности целой части от того что появляется дробная. Вы точно убедились что это необходимо? А ещё в требуемой заказчиком mega48P запросто может нехватить программной памяти! Её там всего 4 кб. Мало.
|
|
|
|
|
Feb 5 2012, 19:53
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Цитата Выглядит сомнительно. Плавучка не теряет точности целой части от того что появляется дробная. Вы точно убедились что это необходимо? При увеличении абсолютного значения числа его точность (ака точность дробной части) теряется. Поэтому необходимо. Цитата А ещё в требуемой заказчиком mega48P запросто может нехватить программной памяти! Её там всего 4 кб. Мало. Что делать - будем пытаться вписаться. Тем более, что на самом деле её там всего 512 байт http://www.ekits.ru/index.php?productID=2567
|
|
|
|
|
Feb 7 2012, 14:37
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(maksimp @ Feb 5 2012, 18:34)  В плавучке мантисса занимает 23 бита плюс один не хранимый всегда равный 1. Итого 3 байта. Чтобы перемножить два числа нужно перемножить мантиссы. AVR выполняет умножение байт на байт за одну команду, чтобы перемножить два 3-байтовых числа нужно 9 команд умножения. И порядки сложить. В плавучке вычисление spline = ds + tmp * (cs + tmp * (bs + as*tmp)); - то есть 6 операций - занимает 860 тактов (см ссылку выше в теме). то есть 146 тактов на операцию. А чтобы перемножить два 40 битных числа с фиксированной точкой, то есть 5 байтных, нужно 25 команд умножения. Каждая команда умножения даёт два байта результата, которые нужно прибавить к промежуточному результату (для всех кроме 5 первых умножений). То есть нужно почти в 2 раза больше команд сложения ещё, 40 штук вроде. Итого уже 25*2+40*1=90 тактов. Это без учёта пересылок, вызова функций и т.д. Таким образом 40 битная фиксированная точка может оказаться и вовсе не быстрее плавучки. И по крайней мере не на порядок быстрее 1) Ну да, надо 9 команд умножения и 6 сложения, чтобы перемножить 3-байтные мантиссы двух чисел с плавающей запятой. Но это не всё, ещё со знаком повозиться, еще надо 48-битную мантиссу результата отнормировать, и экспоненту подправить, ещё надо сравнить с мин. и мах. числом...Вы всё же посмотрите на подпрограммы умножения двух чисел с плавающей запятой. Что интересно, сложение в плавучке не такое простое дело, как может показаться. Надо мантиссы выровнять, сложить, результат пронормировать... 2) Теперь про 40-битные числа с фиксированной точкой. Ну 40 я взял от фонаря, вы и ухватились, а если бы я сказал 64? Поэтому давайте подойдём к вопросу с разумных позиций. Для хранения плавточки нужно 32 бита, т.е. 4 байта., вот и возьмём для фиксточки те же 32 бита. Диапазон представления тоже не маленький 192 дБ. Сигналы с Луны можно обработать :-). Умножение 32х32 я бы точно уложил в 100 тактов, ну а сложение - 4 такта. Вгрубе для вычисления spline хватит 300 тактов против ваших 900 (это ещё проверить бы надо), в ТРИ раза, не хило, хоть и не на порядок.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Feb 11 2012, 09:15
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
Возможно вас это позабавит, но я написал на 1С симулятор работы с моим МК, плавучей библиотекой, ОЗУ....  С выводом любой - текстовой и графической отладочной информации, статистики и прочего по результатам работы алгоритма, возможностью сначала написать и отладить алгоритм в человеческой математике, проверить графически результаты его работы и там же перевести и посмотреть в математике МК. Ошибки ловятся на ура - я просто не представляю, как бы я их ловил в АВР-студио, без графики, с долгим временем симулирования. А если добавить в мой симулятор регистры и asm команды (что несложно но врядли нужно), будет почти труЪ
|
|
|
|
|
Feb 13 2012, 16:01
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(demiurg_spb @ Feb 13 2012, 07:22)  Нет. Атмел ничего "такого" не делал. Максимум fixed-point арифметика в avr-gcc. Вы хотите сказать, что у Атмела в официальных аппнотах не предлагаются ассемблерные библиотеки для своих кристаллов для пишущих на ассме? Ни плавающей точки, ни тригонометрических функций? что-то слабо верится. Хм. хотя они вроде сразу нормальный Си предлагали, наверное тогда да, никто на ассемблере и не извращался в AVR. PS Упаси Боже подумать что хвалю одного производителя в угоду другому. Просто как-то сомневаюсь что у Атмела этого не было. Больше поверю что у них там это хитрозасунуто или вообще снесено с официальной страницы как устаревшее.... PPS Ну нет так нет.
|
|
|
|
|
Feb 13 2012, 16:32
|
Местный
  
Группа: Свой
Сообщений: 352
Регистрация: 13-08-11
Из: Воронеж
Пользователь №: 66 710

|
С наличием плавучей библиотеки то как раз проблем нет - она дадена. Только конечно некоторые простые функции придется ещё дописать. И самое что меня больше всего в ней беспокоит, это следующие вопросы 1) выдает ли она когда нибудь -0 в качестве результата (ноль с выставленным байтом знака) 2) как она пережевывает этот -0 в качестве входящего параметра 3) как она пережевывает +- бесконечность в качестве входящего параметра для арифметических операций и что выдает 4) как переводит в целое число если оно не вмещается в подготовленные для него 3 байта Ну и ещё некоторые вопросы. Часть из них можно проверить, но есть ли гарантия что поведение при проверке будет аналогичное всегда при любых случаях? И конечно, волнуют больше другие алгоритмы, не влезая даже внутрь реализации плавучих функций. Сейчас мне требуется на цикл навскидку десяток умножений, десяток сложений/вычитаний и пара делений - думаю, можно ли оптимизировать логику и уменьшить их количество. ЗЫ ну и конечно если библиотека работает в своем формате, это потребует перевода всех входных и выходных параметров из IEEE и обратно - а это должно быть оправдано только существенной прибавкой скорости выполнения операций в ней, иначе как-то необоснованно получается.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|