Что даёт оптимизация -Ofast ? (Какие могут быть с ней проблемы?)

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Ответить
MiK13
Сообщения: 1164
ОС: Linux Debian

Что даёт оптимизация -Ofast ?

Сообщение MiK13 »

Как-то обратил внимание, что программа расчёта таблиц под RHEL работает чуть быстрее, чем под Debian 9. Проверял командой time.
Сейчас решил проверить ещё раз на своём компьютере под Debian 9, CentOS 7 и Kali. Различий не заметил.
Но заметил, что программа, компилированная gcc 4.8.5 (из CentOS) при опции -O2 работает почти на 10% дольше, чем при -O3 (6.7 с вместо 6.1)
С компилятором 6.3.0 (Debian) разницы вообще не заметил (примерно 6.2 секунды)
С компилятором 8.2.0 (Kali) разница если и была, но очень маленькая (тоже примерно 6.2 секунды, иногда чуть меньше)
Но выдав man gcc я обнаружил, что у него опций оптимизации больше двухсот. И среди прочих увидел -Ofast. Решил её попробовать.
И время счёта уменьшилось больше, чем в ТРИ раза -- примерно до 1.86 секунды
Время определял по разнице информации от gettimeofday.
Но последующий анализ показал, что результат при этом получается немного другой. То есть таблицы в целом похожи, но значения в них немного отличаются.
Поэтому возник вопрос.
В каких случаях можно использовать эту оптимизацию, а в каких нет? Насколько серьёзны могут быть искажения результатов?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Что даёт оптимизация -Ofast ?

Сообщение Bizdelnick »

Ну Вы же man читали, должны были найти, что
It turns on -ffast-math
и дальше
-ffast-math Sets -fno-math-errno, -funsafe-math-optimizations, -ffinite-math-only, -fno-rounding-math, -fno-signaling-nans and -fcx-limited-range.
и ниже про все эти опции.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Что даёт оптимизация -Ofast ?

Сообщение MiK13 »

Bizdelnick писал:
17.07.2019 15:59
Ну Вы же man читали, должны были найти, что ...
Да, man gcc читал. Это видел.
Но меня интересует, какие из-за этого могут быть проблемы.
То есть чтобы знать, где можно применять эту оптимизацию, а где нельзя.

Сейчас пытаюсь сравнить результаты.
По относительно сложным формулам рассчитываются две таблицы 2048х1400х2 (матрица преобразования входных значений в координаты).
Элементы таблиц типа short.
Из всех 5734400 элементов в одной таблице различаются 7, в другой -- 4 элемента. Отличие либо на 256, либо на 1.
Отличием в 1 можно пренебречь. А вот отличие в 256 уже не устраивает.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Что даёт оптимизация -Ofast ?

Сообщение Bizdelnick »

MiK13 писал:
17.07.2019 16:51
Элементы таблиц типа short.
Эта опция никак не влияет на обработку целочисленных типов. В каких-то промежуточных преобразованиях, видимо, фигурируют значения с плавающей запятой.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Что даёт оптимизация -Ofast ?

Сообщение MiK13 »

Bizdelnick писал:
17.07.2019 17:08
MiK13 писал:
17.07.2019 16:51
Элементы таблиц типа short.
Эта опция никак не влияет на обработку целочисленных типов. В каких-то промежуточных преобразованиях, видимо, фигурируют значения с плавающей запятой.
Это я знаю. Там при расчётах участвуют данные типа double и формулы довольно сложные, используются sin, cos, exp и sqtr.

Сейчас ради эксперимента написал простую программу, которая вычисляет синус от 0 до 360° с шагом 0.01°. И сравнил результаты.
Из 36 тысяч не совпали 27069. Правда, разница максимум в 15 знаке после точки.

P.S. Интересная вещь.
В программе проверки использовал long double вместо double.
Оператор if(M1[j]!=M2[j]) различий не выявил. Хотя двоичные данные различаются.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Что даёт оптимизация -Ofast ?

Сообщение Bizdelnick »

MiK13 писал:
17.07.2019 17:57
if(M1[j]!=M2[j])
Вы не умеете сравнивать переменные с плавающей точкой?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Что даёт оптимизация -Ofast ?

Сообщение MiK13 »

Bizdelnick писал:
17.07.2019 18:12
MiK13 писал:
17.07.2019 17:57
if(M1[j]!=M2[j])
Вы не умеете сравнивать переменные с плавающей точкой?
А чем плохо сравнение их значений обычным оператором != ?
Там, правда, была ошибка в скрипте. Я сравнивал файл сам с собой (в конце работы ошибся)
Сейчас сравнил их с помощью memcmp/ Результат тот же.
Но различий всего 158. Из 360 тысяч.
Максимальная относительная погрешность -- 4.3e-14
Последний раз редактировалось MiK13 17.07.2019 19:24, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Что даёт оптимизация -Ofast ?

Сообщение Bizdelnick »

MiK13 писал:
17.07.2019 19:16
А чем плохо сравнение их значений обычным оператором != ?
Ну, в принципе, если смысл в том, чтобы проверить полную идентичность результатов вычисления, может, и не так уж плохо.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Что даёт оптимизация -Ofast ?

Сообщение Vascom »

Для многих задач любая ошибка может иметь критическое значение.
Лучше не надеяться, что "пронесёт" и использовать лишь -O2 в продакшене.
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Что даёт оптимизация -Ofast ?

Сообщение MiK13 »

Vascom писал:
18.07.2019 19:05
Для многих задач любая ошибка может иметь критическое значение.
Лучше не надеяться, что "пронесёт" и использовать лишь -O2 в продакшене.
Это понятно. Но нередко время счёта играет немалую роль. И поэтому хотелось бы узнать в каких случаях ошибки могут быть критическими.
Пока я заметил, что при вычислении синуса при long double относительная разность с -O2 не превышает 4.3e-14
Спасибо сказали:
Аватара пользователя
Vascom
Сообщения: 1699
ОС: Fedora 32

Re: Что даёт оптимизация -Ofast ?

Сообщение Vascom »

Это уже тебе решать.
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Что даёт оптимизация -Ofast ?

Сообщение MiK13 »

Vascom писал:
18.07.2019 22:29
Это уже тебе решать.
Естественно :)
Основная причина возникновения этого поста было в то, что я обнаружил более, чем ТРЕХКРАТНОЕ увеличение скорости расчёта. На процессоре Core 2 duo. 3 ГГц. Причём, дома на AMD FX(tm)-6300, 3.5 ГГц увеличение было всего 2-кратным: при -O2 AMD немного опережал Pentium, а при -Ofast отставал (на процессоре i7 1.8 ГГц) увеличение было 3-кратным).
Поэтому у меня и возник вопрос: какие могут быть "подводные камни"?
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Что даёт оптимизация -Ofast ?

Сообщение devilr »

Подводный камень тут один - увеличение скорости работы программы за счёт ухудшения точности вычислений. Тут выкинули лишнего, там сэкономили - оно глядишь и быстрее посчитало. Бесплатно ведь ничего не бывает.
А если бы было - эта опция была бы дефолтной. Всем ведь хочется побыстрее, не?!
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Что даёт оптимизация -Ofast ?

Сообщение Bizdelnick »

MiK13 писал:
19.07.2019 01:42
На процессоре Core 2 duo. 3 ГГц. Причём, дома на AMD FX(tm)-6300, 3.5 ГГц
А в боевых условиях на чём вычисления производятся? Не на таком же старье ведь? Тестируйте на том, на чём реально будет использоваться программа. Можно ещё и затюнить сборку под этот процессор.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить