Easyelectronics.ru

Электроника для всех
Текущее время: 24 фев 2019, 10:25

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




Начать новую тему Ответить на тему  [ Сообщений: 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
Сообщения: 596
Откуда: Киев
Что ты хочешь от флоат!?
а 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
Сообщения: 2555
Откуда: Санкт-Петербург
(с подозрением) Что-то уж больно кучеряво. Реализации 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
Сообщения: 2555
Откуда: Санкт-Петербург
Если очень хочется разобраться - можно включить 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
Сообщения: 1338
И для 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
Сообщения: 2555
Откуда: Санкт-Петербург
Ну, это всё-таки не совсем то: во первых, не видно, какие объектники подлинковались в прошивку (фиг знает, какие там зависимости), во вторых, размер объектника больше, чем размер кода в нём. Потребовать 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
Сообщения: 1338
aamonster писал(а):
Ну, это всё-таки не совсем то
Да, что-то меня не в ту степь занесло ) оно там ещё и с debug оказывается, т.е. даже для оценочного сравнения arm-avr не годится


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

Зарегистрирован: 22 авг 2014, 12:29
Сообщения: 140
Я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
Сообщения: 1050
Откуда: Мы люди простые, живем в лесу, на пенек молимся
Цитата:
функции с префиком f

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

_________________
PL/1 forever!


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

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

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


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

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1338
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
Сообщения: 1338
сам удивляюсь ) добавил ещё туда же для 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
Сообщения: 1338
Я добавил результаты с 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 часов


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

Сейчас этот форум просматривают: Google [Bot]


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

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

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