Перейти к содержанию
    

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

16 minutes ago, Grizzly said:

Из всего этого сомнительного для embedded добра меня заинтересовал только SQLite.
Проверил. В Visual Studio он собирается с любыми опциями.
Так что ссылки говорят только о лени сборщиков gentoo.   

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, AlexandrY said:

Проверил. В Visual Studio он собирается с любыми опциями.

А там где-то говорится, что не собирается?

 

Другое дело, что информации по тем ссылкам ноль: отключили, ибо глючит. Что именно глючит, под каким тулчейном, на каких тестах - загадка.

Так -O2 может годами висеть, потому что когда-то поставлено, а сейчас уже и не вспомнит никто причину.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь, например, говорится о баге в GCC4 при сборке Doxygen (к нашей тематике генерация документации подойдет) с флагом -O3, а не -O2: https://github.com/doxygen/doxygen/issues/2234

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, haker_fox сказал:

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

Зачем? Просто использовать старую версию, где бага нет. И ждать исправления.

В Кейле думаете багов нет?  :wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, jcxz said:

В Кейле думаете багов нет

Думаю, что есть. но может быть меньше, всё-таки там "родной" армовский компилятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

7 часов назад, haker_fox сказал:

Думаю, что есть. но может быть меньше, всё-таки там "родной" армовский компилятор.

Степень баговости чего-то в первую очередь зависит от сложности этого ПО: чем сложнее - тем больше вероятность багов. А не от того - сами придумали систему команд или реализуем чужую (она ведь подробно описана, а значит - все писатели компиляторов находятся в равных условиях). А значит, если говорить, что что-то имеет потенциально меньше багов, значит это что-то заведомо проще -> т.е. - компилятор имеет меньше возможностей, хуже компилит/оптимизирует.

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

Имха.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 minutes ago, jcxz said:

меньше багов, значит это что-то заведомо проще

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 minutes ago, haker_fox said:

...абсолютно не в курсе их дел сейчас

Бросили они его, заменили clang'ом :( Неплохой был компилятор.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, haker_fox сказал:

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

Ну так (если говорить о том баге, который я приводил в первой ссылке), то в IAR-е предыдущих версий его не было. Появился он только в какой-то из версий 8.xx. Тогда (если следовать Вашей логике), в версиях 7.80.x IAR-овцы хорошо знали "особенности архитектуры", а в 8.xx - их забыли?  :wink:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

возвращаясь к моему первому посту

где определена задержка, по моему мнению это не правильное поведение компилятора

со включенной оптимизацией

где без volatile работать не будет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 минут назад, inventor сказал:

это не правильное поведение компилятора

 

Правильное. Посмотрите внимательнее, где и как у вас в коде изменяется LocalTime.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Только что, inventor сказал:

со включенной оптимизацией

где без volatile работать не будет

Правильно все.

Еще раз смотрите:

void Delay(int timer)
{
   u32 Time = LocalTime;  
   while(LocalTime - Time < timer);
}

 

Поскольку LocalTime - обычная переменная, компилятор вправе предположить, что она не изменяется извне, таким образом, ее содержимое он может кэшировать в регистре и не обращаться за ее значением между точками следования.

Соответственно, он вправе сделать примерно такой код:

void Delay(int timer)
{
   u32 Time = LocalTime;  
   while(LocalTime - LocalTime < timer);
}

или

void Delay(int timer)
{
   u32 Time = LocalTime;  
   while(Time - Time < timer);
}

что не приведет к нужному результату.

 

А оптимизирующий компилятор подставит вместо вычитания 0 и сгенерирует лишь проверку timer <= 0, что не соответствует логике программиста, как видите.

Поэтому нужно явно дать команду компилятору не оптимизировать доступ к переменной LocalTime, чтобы при каждом доступе процессор лез за ней в память, а не кэшировал в регистрах. И команда эта - volatile.

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 minutes ago, Grizzly said:

Правильное. Посмотрите внимательнее, где и как у вас в коде изменяется LocalTime.

в чем правильное?

 

u32 local_time;


void Delay(int timer)
{
   s32 t = local_time;
   
   while(local_time - t < timer){
    asm("nop");
   }
}


 

работает с оптимизацией без volatile

если asm Закоментить не работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...