gcc - глупая оптимизация
От: maks1180  
Дата: 28.11.22 19:06
Оценка:
специально переписал код, что-бы не вызывать memset, что-бы быстре работал:
unsigned int c = (count_in_page) >> 2;
for(;c>0; c--) *p++ = 0;

В итоге при компиляции "-O2 -m32", вижу на сайте gcc.godbolt.org (стоит gcc v12.2)
sub esp, 12
mov eax, DWORD PTR [esp+20]
shr eax, 2
je .L2
sub esp, 4
sal eax, 2
push eax
push 0
push DWORD PTR [esp+28]
call memset
add esp, 16

Я не указал, что процессор поддерживает SSE и попросил оптимизировать по скорости "-O2 -m32" почему он считает, что вызов memset будет быстрее ?
Почему он сам за меня решает, может я явно знаю, мне нужно заполнить 8-16 байт, за 2-4 операции *p++ = 0, это же будет явно быстрее чем "call memset" ?
===============================================
(реклама, удалена модератором)
Отредактировано 28.11.2022 19:09 maks1180 . Предыдущая версия .
Re: gcc - глупая оптимизация
От: rosencrantz США  
Дата: 29.11.22 02:20
Оценка: +5 :))) :))) :)
Переходите на нормальные тормознутые языки, где можно работать, а не дрочить на забивание полутора байтов нулями
Re: gcc - глупая оптимизация
От: Zhendos  
Дата: 29.11.22 08:24
Оценка: +1
Здравствуйте, maks1180, Вы писали:

M>специально переписал код, что-бы не вызывать memset, что-бы быстре работал:


M>Я не указал, что процессор поддерживает SSE и попросил оптимизировать по скорости "-O2 -m32" почему он считает, что вызов memset будет быстрее ?

M>Почему он сам за меня решает, может я явно знаю, мне нужно заполнить 8-16 байт, за 2-4 операции *p++ = 0, это же будет явно быстрее чем "call memset" ?

Ну вообще часть работы компилятора и заключается в том чтобы вместо программиста решать
что и как будет быстрее работать. Для этого у него есть мат. модель целевого процессора,
в которой прописано что и как быстрее. Эту конкретную оптимизацию можно выключить с помощью
-fno-tree-loop-distribute-patterns
Re[2]: gcc - глупая оптимизация
От: σ  
Дата: 29.11.22 10:19
Оценка:
R>Переходите на нормальные тормознутые языки, где можно работать, а не дрочить на забивание полутора байтов нулями
Байтоёбслесарей не берут на нормальных языках писать.
Re: gcc - глупая оптимизация
От: fk0 Россия https://fk0.name
Дата: 17.01.23 22:47
Оценка:
Здравствуйте, maks1180, Вы писали:

M>специально переписал код, что-бы не вызывать memset, что-бы быстре работал


memset может быть существенно быстрей самодельного кода в некоторых случаях.
А какой конкретно случай тут -- компилятору не ведомо. И он подставляет обощённый
вариант. Если бы он знал значение c, или хотя бы возможный диапазон значений --
была бы совсем другая история.

https://godbolt.org/z/5cY6rhW9W

Кроме того, если sizeof(*p) < sizeof(int) или _Alignof(*p) < _Alignof(int)
то тоже есть нюансы. Стандартный memset может иметь относительно сложную
реализацию для эффективной работы с большими блоками невыравненных данных,
например.

M>Я не указал, что процессор поддерживает SSE и попросил оптимизировать по скорости "-O2 -m32" почему он считает, что вызов memset будет быстрее?


А почему ты решаешь, что самодельный memset не будет медленее, специально оптимизированной версии из библиотеки?

M>Почему он сам за меня решает, может я явно знаю, мне нужно заполнить 8-16 байт, за 2-4 операции *p++ = 0, это же будет явно быстрее чем "call memset" ?


https://godbolt.org/z/6fe635j8q
Re: gcc - глупая оптимизация
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.01.23 20:40
Оценка:
Здравствуйте, maks1180, Вы писали:

M>Почему он сам за меня решает, может я явно знаю, мне нужно заполнить 8-16 байт, за 2-4 операции *p++ = 0, это же будет явно быстрее чем "call memset" ?


Потому, что может.

Я думаю, если скастировать указатель в указатель на volatile байты, то gcc перестанет умничать.
Re: gcc - глупая оптимизация
От: cppguard  
Дата: 24.01.23 05:57
Оценка:
Здравствуйте, maks1180, Вы писали:

M>специально переписал код, что-бы не вызывать memset, что-бы быстре работал:

M>unsigned int c = (count_in_page) >> 2;
M>for(;c>0; c--) *p++ = 0;

M>В итоге при компиляции "-O2 -m32", вижу на сайте gcc.godbolt.org (стоит gcc v12.2)

M> sub esp, 12
M> mov eax, DWORD PTR [esp+20]
M> shr eax, 2
M> je .L2
M> sub esp, 4
M> sal eax, 2
M> push eax
M> push 0
M> push DWORD PTR [esp+28]
M> call memset
M> add esp, 16

M>Я не указал, что процессор поддерживает SSE и попросил оптимизировать по скорости "-O2 -m32" почему он считает, что вызов memset будет быстрее ?

M>Почему он сам за меня решает, может я явно знаю, мне нужно заполнить 8-16 байт, за 2-4 операции *p++ = 0, это же будет явно быстрее чем "call memset" ?

Потому что отсутствие ошибок гораздо важнее ускорения на 0.001%. Поскольку код memset посмотрело множество людей, то вероятность найти в нём ошибку будет бесконечно мала по сравнению с кодом, который писал и видел всего один человек. Впрочем, эту оптимизацию можно отключить.
Re[2]: gcc - глупая оптимизация
От: pagid_ Россия  
Дата: 25.01.23 19:48
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Потому что отсутствие ошибок гораздо важнее ускорения на 0.001%. Поскольку код memset посмотрело множество людей, то вероятность найти в нём ошибку будет бесконечно мала по сравнению с кодом, который писал и видел всего один человек.

Каких еще ошибок? В случае ошибки программиста компилятор берет на себя наглость смелость не указать на неё, а исправить по своему разумению? Вот это новость!
Re[3]: gcc - глупая оптимизация
От: cppguard  
Дата: 26.01.23 00:23
Оценка:
Здравствуйте, pagid_, Вы писали:

_>Каких еще ошибок? В случае ошибки программиста компилятор берет на себя наглость смелость не указать на неё, а исправить по своему разумению? Вот это новость!


Программист велосипедит memset. Компилятор это замечает и говорит: "Ты, конечно, рукожоп знатный, но давай таки я заменю твой кустарный мемсет на нормальный, реализацию которого проверили тысячи программистов по всему миру. А коли уж ты такой крутой, что напишешь лучше, то должен быть вкурсе про флаг --fno-lto, который отключает данную оптимизацию". Так понятно?
Re[4]: gcc - глупая оптимизация
От: pagid_ Россия  
Дата: 26.01.23 03:23
Оценка:
Здравствуйте, cppguard, Вы писали:

C>Программист велосипедит memset.

И что. с каких это пор функцией оптимизатора, да и компилятора в целом, стало исправление стиля программиста?

C>Компилятор это замечает и говорит: "Ты, конечно, рукожоп знатный, но давай таки я заменю твой кустарный мемсет на нормальный, реализацию которого проверили тысячи программистов по всему миру. А коли уж ты такой крутой, что напишешь лучше, то должен быть вкурсе про флаг --fno-lto, который отключает данную оптимизацию". Так понятно?

Так еще бы он что-то говорил. он как раз в тихушку наковырял.
Если бы это было предупреждение "А не лучше бы здесь использовать mеmset()", то и вопросов бы не было.

Нет, к стилю и велосипедостроению это отношения не имеет. Это действительно попытка оптимизации, и memset действительно в некоторых (многих ) случаях работает быстрее такого цикла. Но все же это тот случай, когда оптимизатор слишком много на себя берет и ведет себя неадекватно.
Re[5]: gcc - глупая оптимизация
От: cppguard  
Дата: 26.01.23 22:23
Оценка:
Здравствуйте, pagid_, Вы писали:

_>И что. с каких это пор функцией оптимизатора, да и компилятора в целом, стало исправление стиля программиста?


С тех пор, как разработчики компилятора так решили, очевидно же. Кому не нравится, тот пусть не использует. Free as free speech.

_>Так еще бы он что-то говорил. он как раз в тихушку наковырял.

_>Если бы это было предупреждение "А не лучше бы здесь использовать mеmset()", то и вопросов бы не было.

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

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


Это всего лишь программа. Так можно прикопаться к Inkscape, что та сплайны строит "как-то не так", оптимизирует или что-то там. Есть стандарт, компилятор старается ему соответствовать. Кто пишет под bare metal, должен быть в кусре таких дел. Как и тот, кто занимается тонкой оптимизацией.
Re[6]: gcc - глупая оптимизация
От: pagid_ Россия  
Дата: 27.01.23 03:49
Оценка:
Здравствуйте, cppguard, Вы писали:

C>С тех пор, как разработчики компилятора так решили, очевидно же. Кому не нравится, тот пусть не использует. Free as free speech.

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