Jump to content

    
Sign in to follow this  
inventor

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

Recommended Posts

23 minutes ago, inventor said:

то и наблюдаемое поведение будет разным

Мда, идея использовать понятие "наблюдаемое поведение" была явно неудачной.
Я бы попробовал взять понятие "причинность".  
Компилятор вправе удалить все операции у которых  нет причины, нет интринсиков  и нет следов использования извне. 

Значит надо сейчас скомпилить этот проблемный код в библиотеку и посмотреть что будет в этом случае.   
 

Share this post


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

если при оптимизации пишешь local_time как volatile - то она работает как задержка

Время выполнения и размер программы не входят в понятие "наблюдаемое поведение".

Share this post


Link to post
Share on other sites

Inventor, почитайте на досуге:

https://habr.com/sandbox/114114/

http://www.pic24.ru/doku.php/osa/articles/volatile_for_chainiks

https://tproger.ru/problems/what-is-the-purpose-of-the-keyword-volatile-in-c/

Хочу подчеркнуть, что второй ссылкой я не хочу косвенно намекнуть о Вашем непонимании в отношении названия статьи - не я ее автор. Но эти ссылки реально полезно прошерстить. Иначе все эти 7 страниц будут впустую, а понимание так и не придет...:scratch_one-s_head:

Edited by Arlleex

Share this post


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

А Вы не находите, что наличие asm("nop")...

Вопрос, почему оно с непустым телом работает - тоже вопрос

Читайте документацию!

asm volatile("" ::: "memory");

creates a compiler level memory barrier forcing optimizer to not re-order memory accesses across the barrier.

Сомнения в работе оптимизирующего компилятора большей частью от безграмотности.

 

Edited by _3m

Share this post


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

Читайте документацию!


asm volatile("" ::: "memory");

creates a compiler level memory barrier forcing optimizer to not re-order memory accesses across the barrier.

Сомнения в работе оптимизирующего компилятора большей частью от безграмотности.

Во-первых, при чем тут я?

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

Share this post


Link to post
Share on other sites
1 hour ago, Arlleex said:

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

но она работает

кстате. lwip 1.3.2 volatile переменная объявлена всего один раз

Share this post


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

кстате. lwip 1.3.2 volatile переменная объявлена всего один раз

КстатИ. И о чем это нам должно говорить?

Share this post


Link to post
Share on other sites
1 hour ago, inventor said:

но она работает

кстате. lwip 1.3.2 volatile переменная объявлена всего один раз

В mbed, который включает lwip переменные volatile встречаются более 1400 раз! 
 

 

Share this post


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

а что входит?

 

не является ли этот волатайл

такой же ненужной штукой

как auto в C?

 

В 03.12.2018 в 10:25, inventor сказал:

static /*volatile*/ u32 LocalTime  @ ".fastdata" = 0;

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

По определению:

"Volatile - ключевое слово языков C/C++, которое информирует компилятор о том, что значение переменной может меняться из вне и что компилятор не будет оптимизировать эту переменную."

Как следствие, он не выкинет бесполезный while block с "активным ожиданием". 

https://en.wikipedia.org/wiki/Busy_waiting

"Активное ожидание" в SMP среде само по себе затратно и обычно используется скорее как userspace оптимизация, до входа в kernel mode waiting.

Хотя в мире однопоточных МК, я часто вижу использование активного ожидания.

Вопросы могут быть к оптимизатору / компилятору, насколько он строго следует стандартам языка.

Share this post


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

Это должно говорить, что lwip легко перенесет любую оптимизацию. 

Не вижу связи. Но хотел услышать ответ от автора вброса.

Share this post


Link to post
Share on other sites
19 minutes ago, psyhologic said:

"Volatile - ключевое слово языков C/C++, которое информирует компилятор о том, что значение переменной может меняться из вне и что компилятор не будет оптимизировать эту переменную."

Это все познавательно, но по прежнему не раскрыта интрига: так что это за оптимизации над переменной? 
Оптимизируется не переменная, а наверно все таки код вокруг нее.
Так вот как далеко заходят пределы этой  консервации оптимизации при встрече с volatile? 
Может в этом скрытый смысл поднятой темы? 

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