Разница в опциях gcc -ffp-contract
У меня есть вопрос относительно -ffp-contract
пометка в GNU GCC (см. https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html).
Документация флага написана следующим образом:
-ffp-contract=off
отключает сжатие выражений с плавающей точкой.-ffp-contract=fast
включает сжатие выражений с плавающей точкой, такое как формирование слитых операций умножения-сложения, если цель имеет встроенную поддержку для них.-ffp-contract=on
разрешает сжатие выражений с плавающей точкой, если это разрешено стандартом языка. В настоящее время это не реализовано и рассматривается как-ffp-contract=off
, По умолчанию-ffp-contract=fast
,
Теперь вопрос:
- В чем разница между быстрым и включенным?
- Есть ли какой-нибудь другой пример сокращения, кроме FMA (или аналогичный, например, слияния fused-mult)?
1 ответ
В C89 сокращение FP не разрешено. Начиная с C99, реализация может выполнять сжатие выражений в FP по умолчанию, но затем потребуется предоставить #pragma FP_CONTRACT
который может переключаться, чтобы влиять на поведение сокращения.
Таким образом, переключатель GCC должен был быть:
-ffp-contract=off
Не сокращайся. игнорировать#pragma FP_CONTRACT
, Это по умолчанию для-std=c89
,-ffp-contract=on
: Включить сжатие по умолчанию и честь#pragma FP_CONTRACT
, Это будет по умолчанию для-std=c99
и выше.-ffp-contract=fast
: Мы не требуем соответствия ISO в режиме быстрой математики, поэтому нормально всегда заключать контракты, даже отдельные выражения (см. Комментарий Марка Глисса).
К несчастью, #pragma FP_CONTRACT
пока не реализован в GCC, так что пока -ffp-contract=on
делает то, что необходимо, чтобы соответствовать ISO:ничего.
Вам нужно было бы покопаться в источниках (или в списке рассылки), чтобы увидеть, какие сокращения GCC может делать, но это не обязательно должно быть ограничено FMA.
О чем говорит стандарт C11#pragma FP_CONTRACT
:
§6.5¶8: Плавающее выражение может бытьсжато, то есть вычислено так, как если бы оно было единственной операцией, тем самым исключая ошибки округления, подразумеваемые исходным кодом и методом оценки выражения.89) Прагма FP_CONTRACT in предоставляет способ запретить контрактные выражения. В противном случае, и как выражения выражаются как контракт, определяется реализацией.90)
89) Промежуточные операции в сжатом выражении оцениваются как с бесконечным диапазоном и точностью, в то время как заключительная операция округляется до формата, определенного методом оценки выражения. Сжатое выражение может также пропускать исключения с плавающей точкой.
90) Эта лицензия специально предназначена для того, чтобы реализации могли использовать быстрые машинные инструкции, которые объединяют несколько операторов Си. Поскольку сокращения потенциально подрывают предсказуемость и могут даже снизить точность выражения, их использование должно быть четко определено и четко задокументировано.