Разница в опциях 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) Эта лицензия специально предназначена для того, чтобы реализации могли использовать быстрые машинные инструкции, которые объединяют несколько операторов Си. Поскольку сокращения потенциально подрывают предсказуемость и могут даже снизить точность выражения, их использование должно быть четко определено и четко задокументировано.

Другие вопросы по тегам