Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
27.05.2012, 07:19
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Оптимизация программ для AVR32 32UC3A
1. Подскажите как можно оптимизировать программы написанные для 32UC3A (AVR32) на Си в Atmel Studio 6. В частности интересует ускорение работы с числами с плавающей запятой. В алгоритме при расчете данных в цикле есть строка в которой осуществляется умножение double числа на int32.
Пример:
double a = 1.032545876;
int32 b = 15;
double c = a * b;
В описании серии контроллеров 32UC3 Atmel пишет что они поддерживают некоторые DSP команды и могут умножать числа с плавающей запятой чуть ли не за 2 такта. Но в реальности компилятор (GNU ToolChain) генерирует не менее 50 ассемблерных строк.
P.S. изменить алгоритм и уйти от использования нецелых чисел не предлагать. Я уже об этом думаю, меня больше интересует сам факт ускорения таких вычислений на этой платформе.
2. В частности интересует мнение форумчан о Atmel Studio 6. Очень смущает то, что она генерирует даже для простейших программ код размером не один десяток килобайт. На Atmega16 (язык тоже Си компилировал в Codevision) такие же алгоритмы занимали в разы меньше ПЗУ контроллера. При написании использую Atmel Fraimwork.
Последний раз редактировалось Flopix; 27.05.2012 в 07:23.
|
|
|
|
27.05.2012, 08:20
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
Вместо double попробуйте float. double 64 бита на 32 битных ядрах и никто не обещал поддержку плавучки шире разрядности процессора. float 32 бита - вполне может компилятор задействовать аппаратные возможности. Но все равно в 2 такта не будет. И b тоже сделайте плавучим, иначе даже при аппаратных средствах 15 в 15.0 будет преобразовываться и соответственно потреблять память и такты.
|
|
|
|
27.05.2012, 09:41
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
kison, попробую. При прогоне алгоритма на ПК в Borland Builder в режиме отладки, если поставить тип float вместо double, то программа иногда генерирует исключение переполнения переменной.
И еще, значения переменных на avr32 хранятся в памяти не в обратном порядке как на ПК (сначала младший, а потом старшие байты). Это особенность компилятора или архитектуры?
|
|
|
|
27.05.2012, 11:52
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
умножение на 15 можно представить в виде (a‹‹4)-a.
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
27.05.2012, 11:58
|
|
Супер-модератор
Регистрация: 15.10.2007
Сообщений: 3,539
Сказал спасибо: 172
Сказали Спасибо 1,561 раз(а) в 811 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
Сообщение от Easyrider83
|
умножение на 15 можно представить в виде (a‹‹4)-a.
|
У него число с плавающей точкой.
|
|
|
|
27.05.2012, 11:59
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
|
|
|
Сказали "Спасибо" Easyrider83
|
|
|
27.05.2012, 13:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
Есть быстрые методы умножения длинных чисел, думаю, по простоте, для мк. лучше всего подходит , интуитивно понятный, метод умножения Карацубы: http://ru.wikipedia.org/wiki/%D0%A3%...83%D0%B1%D1%8B , или более наглядно : http://habrahabr.ru/post/124258/ , как говориться, разделяй и властвуй!
|
|
|
Сказали "Спасибо" nonamedov
|
|
|
27.05.2012, 13:26
|
|
Гражданин KAZUS.RU
Регистрация: 31.12.2010
Сообщений: 837
Сказал спасибо: 371
Сказали Спасибо 153 раз(а) в 113 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
nonamedov, число не длинное. Уверенны что алгоритм Карацубы поможет при умножении дробных чисел?
|
|
|
|
27.05.2012, 13:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
Сообщение от Flopix
|
kison, попробую. При прогоне алгоритма на ПК в Borland Builder в режиме отладки, если поставить тип float вместо double, то программа иногда генерирует исключение переполнения переменной.
|
Значит не судьба на чисто аппаратных особенностях поездить. 50 команд вообще неплохой результат для перемножения double и целого. Если там конечно циклов нет Целое сначала преобразуется в плвучее - это такты и команды. Потом перемножается. Если не лезет в float то нужно либо смириться, либо подогнать алгоритм так, чтоб float хватало, либо переписать функцию перемножения самостоятельно. На ассемблере. Но не думаю что выигрыш будет больше пары тактов.
Сообщение от Flopix
|
Это особенность компилятора или архитектуры?
|
Архитектура определяет порядок байт в слове. Порядок слов может быть любым и отдан на откуп компилятору. Проц все равно не умеет работать с данными длинней своей разрядности.
|
|
|
|
27.05.2012, 14:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 06.06.2008
Сообщений: 1,530
Сказал спасибо: 78
Сказали Спасибо 427 раз(а) в 365 сообщении(ях)
|
Re: Оптимизация программ для AVR32 32UC3A
Flopix, нет, конечно, но попробовать стоит, тем более метод проверенный и теоретически подкрепленный, хотя, я бы на Вашем месте сперва попробовал "нормализовать" множители, т.е. сделать так, чтобы дробная и целая часть были примерно равными по размеру, ведь, то что число определено как float, далеко не значит, что битовый размер отведенный под эти части "плавающий", скорее всего он фиксированный, а у Вас дробная часть размером в 4 байта.
|
|
|
Эти 2 пользователя(ей) сказали Спасибо nonamedov за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 18:50.
|
|