Jump to content

    
Sign in to follow this  
inventor

Оптимизация в компиляторе. Нужна или нет?

Recommended Posts

1 hour ago, Сергей Борщ said:

у которых виноват компилятор

Согласитесь, что иногда это так) Некоторые темы в подфоруме IAR красноречиво об этом говорят. Тут правда нужно обладать искусством отличить реально проблемы компилятора от "реально проблемы программиста".

Share this post


Link to post
Share on other sites
16 hours ago, inventor said:

есть ли вообще смысл оптимизации

Смотря по какому критерию опитимизировать: по скорости исполнения кода или по объёму этого самого кода.

Ну и включив оптимизатор, и получив нерабочее решение, вы сразу же должны разобраться в проблеме, ибо она 100% есть! Оптимизатор НЕ меняет логику вашей программы, он лишь изменяет способ её подачи АЛУ процессора. Другими словами банальный цикл с Си может быть реализован в виде цикла на ассемблере, в виде линейного кода или компирования некого объёма памяти. Да, это разное время исполнениния кода и разный объём памяти, и да, здесь могут выплыть баги софта. Например, вы не анализируете флаг готовности результата АЦП (забыли, не усмотрели, не разобрались), а запускаете преобразование, и выполнив некий кусок кода, забираете готовый результат из регистров АЦП. И всё у вас работает прекрасно. Но как только вы включаете оптимизацию по скорости, ваш "медленный" неоптимизированный цикл начинает исполняться со скоростью света, и... результат из АЦП уже неправильный. Почему? А нет той задержки, необходимой для завершения преобразования. Кто виноват? Компилятор? Да, в первую очередь конечно он)))) Но немного подумав, и добавив опрос флага готовности АЦП или прерывание по завершению преобразования, вы выходите из зависимости компоновки кода, и по настоящему наслаждаетесь результатами работы оптимизатора.

Share this post


Link to post
Share on other sites
7 hours ago, haker_fox said:

Согласитесь, что иногда это так) Некоторые темы в подфоруме IAR красноречиво об этом говорят. Тут правда нужно обладать искусством отличить реально проблемы компилятора от "реально проблемы программиста".

Я честно не видел ни одной темы тут где можно было бы однозначно говорить об ошибке компилятора. 
В многозадачных средах смена опции оптимизации приводит к изменению и ускорению последовательностей вытеснения. 
А в любом большом проекте на 100 тыс. строк и более попадаются финты с экономией на объектах синхронизации, поскольку это дорого по ресурсам процессора. 
Вот они то и вылазят когда последовательности вытеснения ложаться определенным образом.
Я тут упоминал как то weird machines для взлома эксплуатирующие такой подход. 

 

Share this post


Link to post
Share on other sites
30 минут назад, AlexandrY сказал:

Я честно не видел ни одной темы тут где можно было бы однозначно говорить об ошибке компилятора.

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=147939

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=148387

Случались баги и в предыдущих версиях. Только они случаются многократно реже, чем тут возникают сообщения типа "IAR опять глючит". И их наличие подтверждается куском си-кода + соответствующим ему результатом компиляции (асм), а не фразой типа "чё-то я тут написал и нифига не работает, видимо компилятор неправильно компилит".

 

PS (по IAR-у): В последней версии (8.32.1) появился новый баг: ассемблер не понимает относительных путей для INCLUDE в асм-файлах. Например: INCLUDE  ..\version.h - ошибка компиляции. Хотя раньше работало. Написал в поддержку. Сейчас они разбираются с этим. Как разберутся, напишу им по поводу https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=148387

Share this post


Link to post
Share on other sites
17 часов назад, inventor сказал:

речь шла оптимизации как таковой

предыдущие ораторы накинулись на меня, назвав лохом

что мол прога должна работать при любой оптимизации

Давайте разделим вопрос на 2 связанных, но не тождественных части. Исходный код должен описывать поведение ПО в соответствии с нормами языка записанными, в случае С/С++, в тексте стандарта. Если это так, то корректно написанный компилятор, при любых опциях оптимизации (кроме тех которые явно не соответствуют стандарту) должен сгенерировать программу с поведением идентичным исходным кодам, мнению программиста, и тому что скомпилировано при других опциях оптимизации.

Сложность С/С++ в том что ради возможности оптимизировать в текст стандарта введено понятие undefined behavior (детали опустим). Это тот случай когда синтаксически корректная программа является тем не менее некорректной.

Так сложилось что без опций оптимизации такие некорректные программы тем не менее могут компилироваться в соответствии с представлениями программиста. Являются ли они от этого корректными? Правильный ответ - нет. Бывают ли проекты у которых в ридми записано, что они не могут быть собраны с высокими уровнями оптимизации? Да.

Пока вы пишете сами для себя, никто вам плохого слова не скажет. Не первый и не последний програмист на С/С++, который не знает языка и работает на своих ошибочных представлениях о том как всё работает.

Чем плох такой подход. Проблема в том что если к примеру прошивка перестанет влезать во флеш или к примеру понадобится больше быстродействия. В этом случае включение оптимизации приводит неработоспособному (и это в лучшем случае явно неработоспособному) коду. И выловить такие ошибки можно только вдумчивым дебагом в ассемблере программистом уровнем выше. Долго и дорого в общем. Вторая проблема что если исходник кто-то переиспользует, то и в бОльшем проекте придется отказаться от оптимизации. Естественно что человек хоть раз сталикивается с такими проблемными исходниками, без всякого преувеличения, начинает ненавидеть авторов, которые так пишут. С чем вы собственно здесь и столкнулись.

А мораль проста, оптимизации помогают отловить некорректные участки кода в тот момент когда вы его только написали, что сужает область поиска ошибки с размером проекта до размера кода между двумя комитами. Что позволит выявить UB на стадии когда это не стоит астрономических трудозатрат. Так что вы вообще можете не использовать оптимизацию кроме как средство диагностики ошибочного кода.

Share this post


Link to post
Share on other sites
34 minutes ago, jcxz said:

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=147939

https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=148387

PS (по IAR-у): В последней версии (8.32.1) появился новый баг: ассемблер не понимает относительных путей для INCLUDE в асм-файлах. Например: INCLUDE  ..\version.h - ошибка компиляции. Хотя раньше работало. Написал в поддержку. Сейчас они разбираются с этим. Как разберутся, напишу им по поводу https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=148387

На это вы уже ссылались. Это не баги. Не будем переливать из пустого в порожнее. 

Share this post


Link to post
Share on other sites
10 минут назад, AlexandrY сказал:

На это вы уже ссылались. Это не баги. Не будем переливать из пустого в порожнее. 

Да ладно? А если всё-таки дать себе труд прочитать?

Share this post


Link to post
Share on other sites
16 minutes ago, Kabdim said:

Бывают ли проекты у которых в ридми записано, что они не могут быть собраны с высокими уровнями оптимизации? Да.

Вот тут бы ссылочку на такой ридми, и я бы поверил всем остальным вашим словам. А так извините..., многое противоречит моей практике. 
Спокойно брал дистрибутивы FreeRTOS, uC/OS, MQX, mbed ... компилировал с максимальной оптимизацией и всегда все прекрасно работало. 
Если и были проблемы в BSP то решались в течении пары дней.  
Что за маргинальные такие неуловимые проекты с невозможность максимальной оптимизации тут упоминаются никак в толк не возьму.  
 

Share this post


Link to post
Share on other sites
11 minutes ago, jcxz said:

Да ладно? А если всё-таки дать себе труд прочитать?

Я читал. Там половина поток сознания, остальное фрагментарные наблюдения без систематических тестов. 

Share this post


Link to post
Share on other sites
1 минуту назад, AlexandrY сказал:

Я читал. Там половина поток сознания, остальное фрагментарные наблюдения без систематических тестов. 

Скажите правду: "Читал и ничего не понял".  :biggrin:

Там приведены конкретные си-строки и участки кода в которые они компилируются, в которых происходит ошибка. Т.е. - всё предельно разжёвано. Но если даже так не понятно, то... больше говорить не о чем.

Share this post


Link to post
Share on other sites

Если заметили я там участвовал в одном из обсуждений и доказал что это не баг, а проблема писателей софта. 
Но увидел однако что вы недостаточно сами исследовали обнаруженный вами эффект.
При таком отношении не вижу смысла спорить с вашими выводами.  Обнаружили и на том спасибо. 


 

Share this post


Link to post
Share on other sites
1 час назад, AlexandrY сказал:

Если заметили я там участвовал в одном из обсуждений и доказал что это не баг, а проблема писателей софта.

Т.е. - то что при выполнении операции над 16-битными данными, компилятор пропустил команду расширения их до 32 бит (UXTH) и обработал как 32-битные данные, с соответственно неверным результатом - это проблема писателей софта? :shok:  Да уж.... Больше нет слов.  :biggrin:

Share this post


Link to post
Share on other sites

Язык предоставляет возможность (инструмент), от программиста зависит как эту возможность использовать.

Соответственно от уровня программиста будет зависеть насколько красиво/ужасно применены оптимизации, как разрешены зависимости, сохранена ли кроссплатформенная переносимость кода.

 

Share this post


Link to post
Share on other sites
4 hours ago, jcxz said:

Там приведены конкретные си-строки и участки кода в которые они компилируются, в которых происходит ошибка.

Есть ли в таких случаях переходить на другой компилятор, например Keil? Про GCC молчу, ибо они все такие разные...

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this