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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> WinAVR-20081205 и тенденции, С каждым релизом WinAVR размер кода растет :(
_Pasha
сообщение Feb 12 2009, 10:29
Сообщение #16


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(ARV @ Feb 12 2009, 13:24) *
на моем проекте -mshort-calls вообще не сработала

Потому что должен быть один модуль с длинными вызовами и большинство с включенным -mshort-calls , но это неудобно, конечно.
Go to the top of the page
 
+Quote Post
alx2
сообщение Feb 12 2009, 10:32
Сообщение #17


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(ARV @ Feb 12 2009, 12:19) *
Было 18204 байт результрующего кода (WinAVR 20080610), стало 18350 байт.
Хочу заметить, что размер кода - не единственно возможный критерий качества оптимизации. Может может там с оптимизацией по скорости выполнения стало лучше?
Цитата(ARV @ Feb 12 2009, 13:25) *
с моей точки зрения, сохранение чего бы то ни было при входе в main() для AVR без ОС - это вообще никогда не нужно!
логичнее было бы сделать опцию именно для включения сохранения контекста main()
Не согласен. Во-первых, для указания компилятору, что из функции (любой, а не только main!) никогда не выполняется возврат, существует специальный атрибут. во-вторых, сохранение регистров, которые потом не будут нужны, не нарушает работу программы, а лишь делает код не таким оптимальным, как мог бы. Обратное же (несохранение регистров, которые впоследствии нужны) нарушит работу программы. Поэтому дефолтным поведением должно быть именно сохранение регистров (если специально не указано, что функция noreturn).
Цитата(ARV @ Feb 12 2009, 14:33) *
в конкретно моем случае я перебрал все опции оптимизации, затрагивающие циклы, включая и выключая их - в лучшем случае изменения размеров не обнаружено
Предлагаю гвоворить более конкретно: вот пример кода, вот результат компиляции gcc такой-то версии с такими-то опциями, а вот - другой версии. Или с другими опциями. Вот анализ арботы оптимизатора. А так - совершенно беспредметный разговор получается...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2009, 10:45
Сообщение #18


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



У меня странная проблема на большом проекте 60КБ и mega1281 опция -Wl,-relax приводит к краху линковки...
avr-gcc (WinAVR 20081205) 4.3.2
Код
#---------------- Linker Options ----------------
#  -Wl,...:     tell GCC to pass this to linker.
#    -Map:      create map file
#    --cref:    add cross reference to  map file
LDFLAGS =
LDFLAGS += -Wl,-Map=$(TARGET).map,--cref
LDFLAGS += -Wl,-relax
LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)

Linking: ../bin/Paragraph4/Paragraph.elf
avr-gcc -mmcu=atmega1281 -I. -gdwarf-2 -DF_CPU=14745600UL -Os
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes
-Wa,-adhlns=..............
--output ../bin/Paragraph4/Paragraph.elf -Wl,-Map=../bin/Paragraph4/Paragraph.map,--cref -Wl,-relax
-Wl,-u,vfprintf -lprintf_flt -lm
make: *** [../bin/Paragraph4/Paragraph.elf] Error 1

Проверил ещё на нескольких проектах при добавлении LDFLAGS += -Wl,--relax на некоторых из них происходит крах линкера
(см. картинку во вложенном файле).

Что это? И как быть?
Прикрепленные файлы
Прикрепленный файл  ld_bug256.bmp ( 80.35 килобайт ) Кол-во скачиваний: 17
 


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 10:55
Сообщение #19


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



1. в настоящее время меня интересует качество оптимизации именно по размеру, т.е. -Os. до сего момента никогда -O3 не давало в итоге меньший размер кода, чем -Os. в частности, упомянутый проект выдал 30254 байт при -O3.

2. если бы main() не стояла особняком среди прочих функций Си-программы, я был бы готов с вами согласиться. но это особая функция, потому для нее вполне можно по умолчанию использовать особые режимы генерации кода. тем более для AVR, для которых наличие ОС, вызывающей main(), все же скорее исключение, чем правило.

3. к сожалению, я установил новый WinAVR поверх старого, и пока что не спешу делать откат - возможно, все решится меньшей кровью. потому могу сравнивать только то, о чем уже сказал: есть результат компиляции проекта с опцией -Os без других специальных мер старым WinAVR, и есть новый WinAVR, дающий с теми же опциями проекта худший результат. теперь идет поиск опций, позволяющих добиться прежних результатов с новым компилятором.

пока что наибольший эффект дает применение --relax для линкера и -fcall-prologues для компилятора. однако, я очень сомневаюсь, что эти же опции помогут, например, для atmega8 (--relax уж точно не поможет)... а хочется найти универсальное решение проблемы.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 12 2009, 11:17
Сообщение #20


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ARV @ Feb 12 2009, 10:19) *
Скачал WinAVR-20081205 (до этого был 20080610),
провел тест на проекте для AT90CAN128. Было 18204 байт результрующего кода (WinAVR 20080610),
стало 18350 байт.



Проверте, как влияет на размер кода -fno-split-wide-types.

Анатолий.

Сообщение отредактировал aesok - Feb 12 2009, 11:30
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 11:27
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(aesok @ Feb 12 2009, 14:17) *
Проверте, как влияет на размер кода -fno-split-wide-types.

Анатолий.
влияет: 18278 байт стало. но до стартовых 18204 еще есть резерв smile.gif этот параметр действует одинаково на всех контроллерах?

demiurg_spb, подправьте свой пост, пожалуйста: ну невозможно пользоваться форумом - все разъехалось вширь донельзя!


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2009, 11:38
Сообщение #22


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(ARV @ Feb 12 2009, 14:27) *
влияет: 18278 байт стало. но до стартовых 18204 еще есть резерв smile.gif этот параметр действует одинаково на всех контроллерах?

demiurg_spb, подправьте свой пост, пожалуйста: ну невозможно пользоваться форумом - все разъехалось вширь донельзя!

Поправил. У меня в фаерфоксе ничего не разъезжалось..
И у меня на 102 байта уменьшилось на 60КБ проекте.
А что этот параметр означает-то? В доке тишина (в WinAVR\doc нет файлов, содержащих этот параметр)...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 12 2009, 11:45
Сообщение #23


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ARV @ Feb 12 2009, 14:27) *
влияет: 18278 байт стало. но до стартовых 18204 еще есть резерв smile.gif этот параметр действует одинаково на всех контроллерах?


да.

В этом проекте используются функции для работы с EEPROM из avr-libc?

Цитата(demiurg_spb @ Feb 12 2009, 14:38) *
А что этот параметр означает-то? В доке тишина (в WinAVR\doc нет файлов, содержащих этот параметр)...


это паремет GCC и задокументираван в GCC 4.3.3 Manual.

Цитата
-fsplit-wide-types
When using a type that occupies multiple registers, such as long long on a 32-bit system, split the registers apart and allocate them independently. This normally generates better code for those types, but may make debugging more difficult.
Enabled at levels -O, -O2, -O3, -Os.


Сообщение отредактировал aesok - Feb 12 2009, 11:42
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 12 2009, 11:45
Сообщение #24


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Feb 12 2009, 14:38) *
 В доке тишина (в WinAVR\doc нет файлов, содержащих этот параметр)...

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Упс, опередили.
Т.е. насколько я понял, по умолчанию включено, и это добавляет количество команд mov  вместо movw
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 12 2009, 11:48
Сообщение #25


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(_Pasha @ Feb 12 2009, 14:45) *
Т.е. насколько я понял, по умолчанию включено, и это добавляет количество команд mov  вместо movw


Да. Как сторонний эффект.
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 11:53
Сообщение #26


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Цитата(aesok @ Feb 12 2009, 14:38) *
да.

В этом проекте используются функции для работы с EEPROM из avr-libc?
eeprom.h подключается, но его функции пока не используются.

чем еще можно усушить размер? wink.gif


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 12 2009, 11:55
Сообщение #27


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



На этой странице не встречается "fno-split-wide-types"
Цитата(_Pasha @ Feb 12 2009, 14:45) *
Ступил... Нашёл что надо. Спасибо.
Есть дока по "fsplit-wide-types". Теперь совсем неясно стало.
Если разделять по несвязанным регистрам то код должен уменьшаться а тут мы запрещаем split и он уменьшается. Непонятно....
А на мелком проекте 5КБ код вырос на 4 байтаsmile.gif


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
aesok
сообщение Feb 12 2009, 11:56
Сообщение #28


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(ARV @ Feb 12 2009, 14:53) *
eeprom.h подключается, но его функции пока не используются.

чем еще можно усушить размер? wink.gif


С --param inline-call-cost=4,5,6 игрались?
Go to the top of the page
 
+Quote Post
ARV
сообщение Feb 12 2009, 12:17
Сообщение #29


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



--param -inline-call-cost

=0.........17902
=1,2,3.....17820
=4,5.......17988
=6,7,8.....18002
=9..........18036
=10,11.....18292
=12.........исходные 18350
при дальнейшем росте значения идет так же рост размера smile.gif

при этом никакие другие параметры не использовал! комбинация -mcall-prologues -fno-split-wide-types --param -inline-call-cost=1 -Wl,-relax дает 17112 байт! более чем на килобайт меньше отправной точки! (правда, в железе не проверил - работает оно или нет?) :D

это предел? еще хачу! smile.gif

P.S. интересно, а со старым компилятором сколько бы вышло? wink.gif проверю обязательно!


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 12 2009, 12:25
Сообщение #30


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



-fsplit-wide-types - совершенно очевидно, что в качестве умолчания оно не подходит.

Остальное - так и думал, инлайны

2ARV: -fno-unroll-loops стоИт?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th July 2025 - 07:40
Рейтинг@Mail.ru


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