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

 
 
5 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Странности при оптимизации
DenisIV
сообщение Dec 23 2008, 12:40
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Кстати, раз уж о глюках:

У меня при включенной оптимизации компилятор думает, что раз тела у while нет, то можно и зациклить сам на себя БЕЗ проверки условия, т.е.

MojBit=1;

while(MojBit==1) { };

в асме выглядит так:

Addr: rjmp Addr

Если в тело хотя бы вставить _NOP(); т.е. while(MojBit==1) {_NOP();};

картина меняется - добавляется загрузка вита в 1 и проверка в теле while. Вопрос знатокам: Почему? Компилятор умнее пользователя?

Модератор.
Тема выделена как отдельная из другого топика.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Dec 23 2008, 12:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(DenisIV @ Dec 23 2008, 15:40) *
Вопрос знатокам: Почему? Компилятор умнее пользователя?
Почему картина поменялась после добавления _NOP(); - не скажу, вроде на условие в цикле не влияет... А, вот, проверять условие цикла - нет необходимости: переменной MojBit присвоено значение 1 и условие MojBit==1 - всегда выполняется!
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 23 2008, 14:35
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(DenisIV @ Dec 23 2008, 15:40) *
Вопрос знатокам: Почему? Компилятор умнее пользователя?

Ответ прост: бывают умные компиляторы и не очень умные (ну и тупые тоже бывают). Видимо, Ваш компилятор не очень умный: в одной ситуации может оптимизировать до предела, а в другой - не может.
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Dec 23 2008, 18:37
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(Палыч @ Dec 23 2008, 15:52) *
Почему картина поменялась после добавления _NOP(); - не скажу, вроде на условие в цикле не влияет... А, вот, проверять условие цикла - нет необходимости: переменной MojBit присвоено значение 1 и условие MojBit==1 - всегда выполняется!

Не согласен. Вы забыли про прерывания? Вот они и меняют этот бит. Может компилёру нужно дополнительно сообщить, что этот бит ещё где-то может модифицироваться? Вопрос, как...
P.S. Я с асмом дружу очень, но большие модули переписываю на С, потому что надоело при смене типа мк в пределах одного изготовителя приходится сильно менять исходник, а при смене Z80<>PIC<>Holtek<>AVR<>msp430<>PC<>mcs48<>mcs51 и т.д. просто волосы дыбом встают...
Поэтому и прошу помощи... Как было указано в начале темы, мож у мя глюки?
2Moderator: Может мне создать отдельную тему? Но я её хотел назвать именно так, как назвал авторsmile.gif
Go to the top of the page
 
+Quote Post
Nemo2000
сообщение Dec 23 2008, 19:16
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 79
Регистрация: 8-04-05
Из: Санк-Петербург
Пользователь №: 3 972



Цитата(DenisIV @ Dec 23 2008, 21:37) *
Вы забыли про прерывания? Вот они и меняют этот бит. Может компилёру нужно дополнительно сообщить, что этот бит ещё где-то может модифицироваться?


а прочитать тему с самого начала?
при объявлении своей переменной MojBit укажите что она volatile и будет вам счастье
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 23 2008, 22:38
Сообщение #6


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Просто не устаю поражаться. На нашем форуме про volatile уж было все рассказано, подробнее, чем где-бы то ни было, учитывая специфику программирования железа. Ан нет, есть еще граждане про сие не читавшие, да еще и вопрос задающие не поймешь как. Чудно, все это.
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Dec 23 2008, 23:21
Сообщение #7


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(sergeeff @ Dec 24 2008, 01:38) *
Просто не устаю поражаться. На нашем форуме про volatile уж было все рассказано, подробнее, чем где-бы то ни было, учитывая специфику программирования железа. Ан нет, есть еще граждане про сие не читавшие, да еще и вопрос задающие не поймешь как. Чудно, все это.


Прошу простить... Это как допустим чья-то жена получила вчера права, начинает спрашивать мужа: "Как там решить вопрос с ГАИшниками, если..." Муж: "Я ж те говорил, книжки покупал..."

На сколько я знаю, volatile говорит компилятору о том, что все связанные с переменной действия ни в коем случае не оптимизировать. Вопрос для многозадачных или "мощных" систем вроде выглядит по другому: требуется ещё лочить переменную на время обработки данных(например в прерывании меняется массив данных и указатели на него а основная прога может вылететь) И если можно про static.

Просветите плиз тонкости... Может быть еще раз... Ну "я месяц назад получил права" smile.gif
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 23 2008, 23:43
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(DenisIV @ Dec 24 2008, 04:21) *
И если можно про static.

Просветите плиз тонкости... Может быть еще раз... Ну "я месяц назад получил права" smile.gif
Вот тут не найдется для вас ответа на вопрос про static?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 24 2008, 01:12
Сообщение #9


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(DenisIV @ Dec 24 2008, 03:21) *
Прошу простить... Это как допустим чья-то жена получила вчера права, начинает спрашивать мужа: "Как там решить вопрос с ГАИшниками, если..." Муж: "Я ж те говорил, книжки покупал..."

На сколько я знаю, volatile говорит компилятору о том, что все связанные с переменной действия ни в коем случае не оптимизировать. Вопрос для многозадачных или "мощных" систем вроде выглядит по другому: требуется ещё лочить переменную на время обработки данных(например в прерывании меняется массив данных и указатели на него а основная прога может вылететь) И если можно про static.

Просветите плиз тонкости... Может быть еще раз... Ну "я месяц назад получил права" smile.gif


Во-первых, понять, что если есть в системе прерывания и вы их используете - значит уже система многозадачная. Во-вторых. Что значит "приказ не оптимизировать"? Это значит, что какая-то другая задача тоже может эту переменную использовать, а по сему эта самая переменная будет размещена в памяти, а не в регистрах. Вопрос о том, "лочить" или нет эту переменную - вопрос ее размера и особенностей процессора. Если обращение к ней проходит за время, когда прерывание не может возникнуть, то и "лочить" не нужно.
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Dec 24 2008, 02:56
Сообщение #10


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



2rezident: со static (и не тоько) разобрался, спасибо!

Ещё вопросик...

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

Опять же, если будет это всё в одном файле/модуле, то даже при макс. оптимизации компилёр может понять, что переменная юзается внутри в разных функциях (в т.ч и в прерываниях) и не будет оптимизировать до упора?

Т.е. в данном случае не нужен тип global/static/volatile ? (модуль-то один, global итак будет автоматом, вопрос только про оптимизатор)

Да, самое интересное: Я объявляю в модуле main глобальные переменные, в остальных модулях их же, но через extern, т.е. получается, что глобально в пределах проекта, но вот эта заноза-оптимизатор видит только в пределах модуля переменную (в смысле её использования), а не в пределах проекта? Или есть тонкости? Объясните плиз, где грабли... Крыша уже течёт...

Просто я не умею их готовить... (с) какая-то реклама

Чем-то чувствую, что и прав и нет. Хотелось бы понять, где. Я понимаю, RTFM, но всё же... F1 !
То, что люди задают глупые вопросы не означает, что они глупы, просто иногда не хватает опыта...
Сорри, если чуть оффтоп... wink.gif
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 24 2008, 12:41
Сообщение #11


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Я все не пойму, что за проблемы "с этой оптимизацией"? Где конкретно, с чем проблемы? Что компилятор делает не так, как вы хотите?
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Dec 24 2008, 12:55
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(sergeeff @ Dec 24 2008, 15:41) *
Я все не пойму, что за проблемы "с этой оптимизацией"? Где конкретно, с чем проблемы? Что компилятор делает не так, как вы хотите?

Каждый модуль независим для компилятора и компилёр оптимизирует не проект, а данный модуль и если я в одном модуле только читаю а в другом только пишу переменную, то в обоих случаях если я не допишу volatile компилёр просто выкинет эти строки (просто примет за константу данные при компиляции)
Вот в этом и грабли. Всё могло быть хорошо, если модуль один. (Вроде бы)
Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 24 2008, 14:13
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(DenisIV @ Dec 24 2008, 15:55) *
Каждый модуль независим для компилятора и компилёр оптимизирует не проект, а данный модуль и если я в одном модуле только читаю а в другом только пишу переменную, то в обоих случаях если я не допишу volatile компилёр просто выкинет эти строки (просто примет за константу данные при компиляции)
Нет. Компилятор ОБЯЗАН обеспечить состояние переменных, видимое с точки зрения программиста, в любой точке программы. volatile всего лишь заставляет компилятор считать, что состояние переменной может быть изменено не только тем, что написанно в программе. Т.е. компилятор не имеет права выкидывать любые записи и чтения этой переменной. Но он не обязан каким либо другим способом синхронизировать доступ к ней - это обязанность программиста.

Например, если мы имеем код

Код
a=1;

...

a=2;

...

a=3;
то для не volatile переменной компилятор может оставить только последнее присваивание (если в промежутке не было вызовов других функций), для volatile все присваивания останутся



Цитата
Вот в этом и грабли. Всё могло быть хорошо, если модуль один. (Вроде бы)
От количества модулей это не зависит. А вот качество оптимизации может зависеть.
Go to the top of the page
 
+Quote Post
DenisIV
сообщение Dec 24 2008, 15:47
Сообщение #14


Участник
*

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380



Цитата(XVR @ Dec 24 2008, 17:13) *
Нет. Компилятор ОБЯЗАН обеспечить состояние переменных, видимое с точки зрения программиста, в любой точке программы. volatile всего лишь заставляет компилятор считать, что состояние переменной может быть изменено не только тем, что написанно в программе. Т.е. компилятор не имеет права выкидывать любые записи и чтения этой переменной. Но он не обязан каким либо другим способом синхронизировать доступ к ней - это обязанность программиста.

Например, если мы имеем код

Код
a=1;
...
a=2;
...
a=3;
то для не volatile переменной компилятор может оставить только последнее присваивание (если в промежутке не было вызовов других функций), для volatile все присваивания останутся

От количества модулей это не зависит. А вот качество оптимизации может зависеть.

Согласен. А есть ли возможность указать компилятору в данном конкретном примере какой-нибудь командой #cmdxxx НЕ ОПТИМИЗИРОВАТЬ например именно строчку где a=2; ?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 24 2008, 16:26
Сообщение #15


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

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



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

Я уже раньше отмечал, что современные компиляторы занимаются оптимизацией совместно с линкером. Об этом и Александреску в своих книгах пишет. Да и сами можете убедиться, сравнив ассемблерный листинг, генерируемый компилятором и дизассемблированный код. Так что замечания насчет оптимизации на уровне модуля тоже не совсем правомочны.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 1st July 2025 - 05:02
Рейтинг@Mail.ru


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