Easyelectronics.ru

Электроника для всех
Текущее время: 22 апр 2019, 07:29

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Размер операции
СообщениеДобавлено: 07 авг 2015, 14:39 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
Ребят, такой вопрос:
пишу код (простой как веник), никого не трогаю, компилю - все ок. Смотрю а весит аж 6,5 кБ! Ну вроде немного. но предыдущая компиляция пару строк назад давала 2кБ! Начинаю рыть и понимаю, что у меня весят огромные размеры кода строки типа:
float/float = 1096 байт кода
atan(float) - 728 байт

sqrt(x^2+y^2) = 4364!!!!, здесь x,y - int16.

До этого писал на 8бит аврке и не было таких объемов, а тут STM32F042 без FPU, но все же...
Либа math.h подключена
Почему такой огромный размер? Мож я чего не так делаю?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 16:07 
Старожил
Аватара пользователя

Зарегистрирован: 30 янв 2014, 18:09
Сообщения: 602
Откуда: Киев
Что ты хочешь от флоат!?
а sqrt(x^2+y^2) замени на sqrt(x*x+y*y)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 16:16 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
SOVA писал(а):
Что ты хочешь от флоат!?
а sqrt(x^2+y^2) замени на sqrt(x*x+y*y)

Я так и сделал. Я просто тут написал через ^.
А я хочу от следующего : sin( atan( x/sqrt(x*x+y*y) ) )
у меня на AVR вот эта строка (x,y,z - int16) занимает ~164 байта кода.
Я не верю, что на ARM 32 бита она будет занимать почти 6 кБ кода.
Вот что я от него пытаюсь добиться


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 16:48 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2567
Откуда: Санкт-Петербург
(с подозрением) Что-то уж больно кучеряво. Реализации floating point деления, синуса и арктангенса в <82 ассемблерных команды? Не верится.
Может, у вас косяк в замерах, и в avr либа и без этой строчки подключена, и соответствующие модули слинкованы?
Какой объём прошивки получается, если в ней только код
Код:
volatile int x,y,z;
z=sin( atan( x/sqrt(x*x+y*y) ) )
(ну и вся нужная для него обвязка)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 17:26 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
aamonster писал(а):
(с подозрением) Что-то уж больно кучеряво. Реализации floating point деления, синуса и арктангенса в <82 ассемблерных команды? Не верится.
Может, у вас косяк в замерах, и в avr либа и без этой строчки подключена, и соответствующие модули слинкованы?
Какой объём прошивки получается, если в ней только код
Код:
volatile int x,y,z;
z=sin( atan( x/sqrt(x*x+y*y) ) )
(ну и вся нужная для него обвязка)?

Получилось 1 684 байт. Думал, мож ошибся чем... И действительно:
Дословно у меня следующий код:
Код:
sin( atan( (int16)x/hypot( (int16)y,(int16)z ) ) );
( hypot это и есть по сути sqrt(x^2+y^2) )
и я заменяю на
Код:
return 1;


Разница в 134 байта
Атмега 1284p

P.s. Тот же код, но на меге 48 дает горрраздо больший объем кода, но все равно float/float = 420 байт кода, а не 1кБ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 18:17 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2567
Откуда: Санкт-Петербург
Если очень хочется разобраться - можно включить map-файл и посмотреть, какие функции/модули слинкованы и сколько они занимают. Но пока не упёрлись в объём кода - большого смысла в этом нет.
Заодно, кстати, можете сравнить настройки компилятора/линкера: сдаётся мне, для ARM они у вас более жёсткие, чем для AVR (ну там, ключик -ffunction-sections для компилятора и --gc-sections для линкера выставлены)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 18:38 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
aamonster писал(а):
Но пока не упёрлись в объём кода - большого смысла в этом нет.

Дело не столь в объеме, хотя 6 кб из 32 отдавать на 1 строку кода жалковато), сколько во времени итерации. На мои 24МГц эти 6к кода выльются в доли миллисекунды. Вроде бы и не стлоль большие требования к оперативности, но все же не хотелось бы...
Мне кажется у меня либо не правильно настроен компилятор либо хз что.. Просто только на сравнении 8 бит авр 420 байт и 32 бит арм 1кБ - даже смешно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 21:17 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1348
И для arm, и для avr в gcc есть утилита ar. Команда ar -tv math.alibm.a выдаст список всех объектных файлов из math.alibm.a с размерами. Для stm32f042 libm.a берётся из каталога armv6-m


Последний раз редактировалось vt340 07 авг 2015, 22:05, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 21:47 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2567
Откуда: Санкт-Петербург
Ну, это всё-таки не совсем то: во первых, не видно, какие объектники подлинковались в прошивку (фиг знает, какие там зависимости), во вторых, размер объектника больше, чем размер кода в нём. Потребовать map-файл с линкера - надёжнее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 21:48 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2012, 00:31
Сообщения: 1797
Откуда: Новокузнецк
ЯadiatoR писал(а):
Дело не столь в объеме, хотя 6 кб из 32 отдавать на 1 строку кода жалковато)

Смысл в другом. 6 кб отдается не на одну строку, это единоразовая плата за float. Следующее использование float будет намного дешевле.

Цитата:
На мои 24МГц эти 6к кода выльются в доли миллисекунды.

Замеряли? Замерьте.

_________________
elisey.su


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 07 авг 2015, 22:46 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1348
aamonster писал(а):
Ну, это всё-таки не совсем то
Да, что-то меня не в ту степь занесло ) оно там ещё и с debug оказывается, т.е. даже для оценочного сравнения arm-avr не годится


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 00:18 
Заглядывает иногда

Зарегистрирован: 22 авг 2014, 12:29
Сообщения: 141
ЯadiatoR писал(а):
aamonster писал(а):
Но пока не упёрлись в объём кода - большого смысла в этом нет.

Дело не столь в объеме, хотя 6 кб из 32 отдавать на 1 строку кода жалковато), сколько во времени итерации. На мои 24МГц эти 6к кода выльются в доли миллисекунды. Вроде бы и не стлоль большие требования к оперативности, но все же не хотелось бы...
Мне кажется у меня либо не правильно настроен компилятор либо хз что.. Просто только на сравнении 8 бит авр 420 байт и 32 бит арм 1кБ - даже смешно...

Посмотрите размер команд , сколько надо память для 8 бит и 32 . Вот и получите разницу . А количество команд думаю у арма даже меньше будет .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 12:18 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
elisey писал(а):
ЯadiatoR писал(а):
Дело не столь в объеме, хотя 6 кб из 32 отдавать на 1 строку кода жалковато)

Смысл в другом. 6 кб отдается не на одну строку, это единоразовая плата за float. Следующее использование float будет намного дешевле.

А действительно... Может так и есть.. Проверю отпишусь

EugenPKH писал(а):
ЯadiatoR писал(а):
aamonster писал(а):
Но пока не упёрлись в объём кода - большого смысла в этом нет.

Дело не столь в объеме, хотя 6 кб из 32 отдавать на 1 строку кода жалковато), сколько во времени итерации. На мои 24МГц эти 6к кода выльются в доли миллисекунды. Вроде бы и не стлоль большие требования к оперативности, но все же не хотелось бы...
Мне кажется у меня либо не правильно настроен компилятор либо хз что.. Просто только на сравнении 8 бит авр 420 байт и 32 бит арм 1кБ - даже смешно...

Посмотрите размер команд , сколько надо память для 8 бит и 32 . Вот и получите разницу . А количество команд думаю у арма даже меньше будет .

А что размер команд? у авр они 16 бит, у арм большинство команд - THUMB2 - тоже 16 бит. По поводу количества - думаю должно быть меньше. Не простаивать же 32 битным регистрам...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 13:28 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 261
Что за чушь насчёт размера? Сейчас проверил. Добавление операций деления или умножения с плавающей точкой увеличивает размер кода на 670 байт (arm gcc). Из которых 358 байт занимает процедура умножения, а 312 байт - процедура деления.

Насчёт функций из math.h. Если ты работаешь с одинарной точностью (float), то надо вызывать функции с префиком f, чтобы у компилятора гарантировано не было желания подставить вызов ф-ции с двойной точностью. Т.е. вместо atan - atanf и т.д. Так же надо следить за кодом. Например, 1.2 для компилятора означает число с двойной точностью (double) и соответственно, он в код включит кучу либ для работы с числами двойной точности. Вместо 1.2 надо писать 1.2f. В общем-то тут в форуме много давалось уже советов на эту тему. Мой совет - вообще не использовать числа с плавающей точкой, если это возможно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 13:36 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
ArtDen писал(а):
Что за чушь насчёт размера? Сейчас проверил. Добавление операций деления или умножения с плавающей точкой увеличивает размер кода на 670 байт (arm gcc). Из которых 358 байт занимает процедура умножения, а 312 байт - процедура деления.

Насчёт функций из math.h. Если ты работаешь с одинарной точностью (float), то надо вызывать функции с префиком f, чтобы у компилятора гарантировано не было желания подставить вызов ф-ции с двойной точностью. Т.е. вместо atan - atanf и т.д. Так же надо следить за кодом. Например, 1.2 для компилятора означает число с двойной точностью (double) и соответственно, он в код включит кучу либ для работы с числами двойной точности. Вместо 1.2 надо писать 1.2f. В общем-то тут в форуме много давалось уже советов на эту тему. Мой совет - вообще не использовать числа с плавающей точкой, если это возможно.

Спасибо, вообще без флоата не получится ибо функции корня/гипотенузы и арктангенса работают с ним. А за f-суффикс спасибо, попробую.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 13:40 
Старожил
Аватара пользователя

Зарегистрирован: 10 май 2014, 01:21
Сообщения: 1052
Откуда: Мы люди простые, живем в лесу, на пенек молимся
Цитата:
функции с префиком f

Может все-таки с суффиксом? Префикс – это «перед».

_________________
PL/1 forever!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 13:56 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 261
trengtor писал(а):
Может все-таки с суффиксом? Префикс – это «перед».

Да, извиняюсь. Ашипся )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 14:54 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1348
int main () {return 0;}
размер бинарника: m0 - 684, m3 - 676, m4 - 672

float x,y; int main () {return (int)sqrtf(x*x+y*y);}
размер бинарника: m0 - 7164, m3 - 4752, m4soft - 4748, m4softfp - 3264, m4hard - 3264

double x,y; int main () {return (int)sqrt(x*x+y*y);}
размер бинарника: m0 - 9156, m3 - 3716, m4soft - 3708, m4softfp - 3708, m4hard - 3768

gcc-4.9.2 -O2

добавил варианты для m4
soft (дефолтный) - без fpu
softfp - с fpu, вызов через ф-ции с теми же именами что и soft
hard - с fpu и регистрами fpu в коде


Последний раз редактировалось vt340 08 авг 2015, 20:15, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 19:12 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
vt340 писал(а):
int main () {return 0;}
размер бинарника: m0 - 684, m3 - 676, m4 - 672

float x,y; int main () {return (int)sqrtf(x*x+y*y);}
размер бинарника: m0 - 7164, m3 - 4752, m4 - 4748

double x,y; int main () {return (int)sqrt(x*x+y*y);}
размер бинарника: m0 - 9156, m3 - 3716, m4 - 3708

gcc-4.9.2 -O2

вот это поворот...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 20:03 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 261
Да, чудеса какие-то )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 20:17 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1348
сам удивляюсь ) добавил ещё туда же для m4 разные варианты с fpu


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 20:46 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
vt340 писал(а):
сам удивляюсь ) добавил ещё туда же для m4 разные варианты с fpu

и каковы результаты?
Вообще не врубаю как у 32 битного контроллера без функций фпу может быть такая существенная разница в размере кода...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 21:40 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1348
Я добавил результаты с fpu прямо в пост с первыми тестами, чтобы всё вместе было. M0 понятно почему от m3/m4 отличается - у него только 16-битные thumb инструкции, он вообще arm предыдущей версии v6, а m3/m4 уже v7 - у них же в 4 раза больше инструкций за счёт добавления 32-битных thumb2. А вот с float-double странный результат, но вроде я не ошибся в тестах


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 22:00 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 23 мар 2012, 16:18
Сообщения: 146
fpu пашет на аппаратном уровне, а без fpu линковщик запихивает библиотеку. Собственно и скорость выполнения кода на F4 будет отличаться от F0. В доке на IAR, в части работы с float, особняком выделен F0. Видать что-то там не все гладко.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Размер операции
СообщениеДобавлено: 08 авг 2015, 22:20 
Старожил

Зарегистрирован: 18 фев 2013, 14:22
Сообщения: 512
zat писал(а):
особняком выделен F0. Видать что-то там не все гладко.

Смелое заявление! Или ИАР опять накосячил?


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 33 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB