Что даёт оптимизация -Ofast ? (Какие могут быть с ней проблемы?)
Модератор: Bizdelnick
Что даёт оптимизация -Ofast ?
Как-то обратил внимание, что программа расчёта таблиц под 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.
Но последующий анализ показал, что результат при этом получается немного другой. То есть таблицы в целом похожи, но значения в них немного отличаются.
Поэтому возник вопрос.
В каких случаях можно использовать эту оптимизацию, а в каких нет? Насколько серьёзны могут быть искажения результатов?
Сейчас решил проверить ещё раз на своём компьютере под 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 ?
Ну Вы же 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.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Что даёт оптимизация -Ofast ?
Да, man gcc читал. Это видел.
Но меня интересует, какие из-за этого могут быть проблемы.
То есть чтобы знать, где можно применять эту оптимизацию, а где нельзя.
Сейчас пытаюсь сравнить результаты.
По относительно сложным формулам рассчитываются две таблицы 2048х1400х2 (матрица преобразования входных значений в координаты).
Элементы таблиц типа short.
Из всех 5734400 элементов в одной таблице различаются 7, в другой -- 4 элемента. Отличие либо на 256, либо на 1.
Отличием в 1 можно пренебречь. А вот отличие в 256 уже не устраивает.
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Что даёт оптимизация -Ofast ?
Эта опция никак не влияет на обработку целочисленных типов. В каких-то промежуточных преобразованиях, видимо, фигурируют значения с плавающей запятой.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Что даёт оптимизация -Ofast ?
Это я знаю. Там при расчётах участвуют данные типа double и формулы довольно сложные, используются sin, cos, exp и sqtr.Bizdelnick писал: ↑17.07.2019 17:08Эта опция никак не влияет на обработку целочисленных типов. В каких-то промежуточных преобразованиях, видимо, фигурируют значения с плавающей запятой.
Сейчас ради эксперимента написал простую программу, которая вычисляет синус от 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 ?
Вы не умеете сравнивать переменные с плавающей точкой?
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Что даёт оптимизация -Ofast ?
А чем плохо сравнение их значений обычным оператором != ?
Там, правда, была ошибка в скрипте. Я сравнивал файл сам с собой (в конце работы ошибся)
Сейчас сравнил их с помощью memcmp/ Результат тот же.
Но различий всего 158. Из 360 тысяч.
Максимальная относительная погрешность -- 4.3e-14
Последний раз редактировалось MiK13 17.07.2019 19:24, всего редактировалось 1 раз.
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Что даёт оптимизация -Ofast ?
Ну, в принципе, если смысл в том, чтобы проверить полную идентичность результатов вычисления, может, и не так уж плохо.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
Re: Что даёт оптимизация -Ofast ?
Для многих задач любая ошибка может иметь критическое значение.
Лучше не надеяться, что "пронесёт" и использовать лишь -O2 в продакшене.
Лучше не надеяться, что "пронесёт" и использовать лишь -O2 в продакшене.
Re: Что даёт оптимизация -Ofast ?
Это понятно. Но нередко время счёта играет немалую роль. И поэтому хотелось бы узнать в каких случаях ошибки могут быть критическими.
Пока я заметил, что при вычислении синуса при long double относительная разность с -O2 не превышает 4.3e-14
Re: Что даёт оптимизация -Ofast ?
Это уже тебе решать.
Re: Что даёт оптимизация -Ofast ?
Естественно
Основная причина возникновения этого поста было в то, что я обнаружил более, чем ТРЕХКРАТНОЕ увеличение скорости расчёта. На процессоре Core 2 duo. 3 ГГц. Причём, дома на AMD FX(tm)-6300, 3.5 ГГц увеличение было всего 2-кратным: при -O2 AMD немного опережал Pentium, а при -Ofast отставал (на процессоре i7 1.8 ГГц) увеличение было 3-кратным).
Поэтому у меня и возник вопрос: какие могут быть "подводные камни"?
Re: Что даёт оптимизация -Ofast ?
Подводный камень тут один - увеличение скорости работы программы за счёт ухудшения точности вычислений. Тут выкинули лишнего, там сэкономили - оно глядишь и быстрее посчитало. Бесплатно ведь ничего не бывает.
А если бы было - эта опция была бы дефолтной. Всем ведь хочется побыстрее, не?!
А если бы было - эта опция была бы дефолтной. Всем ведь хочется побыстрее, не?!
- Bizdelnick
- Модератор
- Сообщения: 20752
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: Что даёт оптимизация -Ofast ?
А в боевых условиях на чём вычисления производятся? Не на таком же старье ведь? Тестируйте на том, на чём реально будет использоваться программа. Можно ещё и затюнить сборку под этот процессор.
Пишите правильно:
в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |