2016-08-15 13 views
4

С сайта ГНУ:«-ftrapv» и «-fwrapv»: что лучше для эффективности?

-ftrapv 
This option generates traps for signed overflow on addition, subtraction, multiplication operations. 
-fwrapv 
This option instructs the compiler to assume that signed arithmetic overflow of addition, subtraction and multiplication wraps around using twos-complement representation. This flag enables some optimizations and disables others. 

У меня есть два вопроса. 1) Какой из этих вариантов лучше для производительности? 2) Что это значит, когда определение -ftrapv говорит, что оно генерирует «ловушки»? Означает ли это исключения? (Я предполагаю, что нет, но это стоит спросить.)

Источник: https://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Code-Gen-Options.html

+0

"_Which быстрее? _" - Измерить его кодом. Я полагаю, это сильно зависит от приложения. –

+0

Не нужно было проверять наличие переполнения. – user4581301

+3

Ни один из них не предназначен для повышения производительности. Если вы используете их для производительности, вы делаете это неправильно. – hvd

ответ

6

весь смысл обоих этих вариантов, чтобы дать Оптимизатор меньше свободу действий, чем это обычно имеет. Поэтому, если вы не встретите ошибку в оптимизаторе, самым быстрым должно быть использование ни того, где оптимизатор предполагает, что ваш код не имеет переполнений и не испускает код для обработки переполнения.

Что означает это, когда определение -ftrapv говорит, что оно генерирует «ловушки»? Означает ли это исключения?

Это не означает исключение на C++. Он зависит от цели, но, предполагая x86, это означает, что библиотеки времени выполнения GCC вызывают повышение SIGABRT, что обычно прерывает вашу программу. На других платформах могут использоваться специальные инструкции CPU, которые вызывают аппаратное исключение. Это в основном полезно для целей отладки и, возможно, в нескольких случаях для обеспечения безопасности, где риск продолжения после переполнения больше, чем риск внезапного прекращения программы.

+1

Проблема заключается не в «испускании кода для обработки переполнения», поскольку все существующие машины являются дополнением к двум. Вместо этого, упущенные возможности оптимизации, для некоторых особых случаев.Но, есть возможность сказать ему оптимизировать циклы в любом случае (извините, я не помню имя опции). –

+0

Кроме того, я сомневаюсь, что документация настолько плоха, что заменяет «прерывания» на «ловушки». Ловушка означает исключение аппаратного уровня (обычно). Его можно обрабатывать определенными платформами способами. –

+0

@ Cheersandhth.-Alf Это было главным образом для '-ftrapv', но даже для' -fwrapv' могут быть дополнительные инструкции: дополнения, которые иначе оптимизируются. Это то, о чем вы говорите, я думаю, просто с другой точки зрения, я беру оптимизированный код в качестве базовой линии, вы принимаете неоптимизированный код в качестве базовой линии. Что касается исключений, у меня создалось впечатление, что ОП спрашивал о исключениях C++, а не об аппаратных исключениях. Но вы правы, что аппаратные исключения могут быть обработаны, я должен отредактировать, чтобы покрыть это. – hvd

1

Оптимальная производительность будет достигнута, если есть способ сообщить компилятору, что в случае переполнения он может свободно выбирать среди всех возможных вариантов поведения , которые отвечают требованиям приложения. Рассмотрение переполнения, поскольку UB даст только оптимальное поведение, если программист может быть настолько уверен в том, что программа никогда не получит никаких входов, которые вызывают переполнение, что даже самое преднамеренно-капризное поведение переполнения, которое можно вообразить, будет соответствовать требованиям.

В случаях, когда было бы приемлемо, чтобы компилятор произвольно выбирал из множества возможных выходов, при условии, что общее поведение остается ограниченным, делая переполнение UB, вероятно, приведет к комбинации наихудшего из всех миров сложность исходного кода и производительность во время выполнения по сравнению с -fwrapv, поскольку программисту пришлось бы указать в исходном коде все операции, которые компилятор будет автоматически генерировать для -fwrapv. Производительность будет хуже того, что может быть достигнуто при использовании менее агрессивного оптимизатора, который был разработан вокруг идеи «получить произвольные данные, но сдержанное поведение», но gcc не предлагает таких параметров.

Перехват переполнения в компиляторе может быть намного дороже, чем перенос переполненных вычислений (или - если компилятор разрешает - пусть они рассматриваются как имеющие произвольную расширенную точность, которая может вести себя недетерминированным образом) но иногда может быть дешевле, чем перехватывание вручную в коде. Полезно ли переполнение захвата в компиляторе, зависит от того, требует ли его потребность в приложении.