Что делает gcc -fno-trapping-math? - PullRequest
0 голосов
/ 16 мая 2018

Я не могу найти ни одного примера, где опция -fno-trapping-math оказывает влияние.

Я ожидаю, что -ftrapping-math отключит оптимизации, которые могут повлиять на то, генерируются ли ловушки или нет. Например, вычисление промежуточного значения с повышенной точностью с использованием инструкций x87 или инструкций FMA может предотвратить возникновение исключения переполнения. Опция -ftrapping-math не предотвращает это.

Устранение общего подвыражения может привести к возникновению одного исключения, а не двух, например, оптимизация 1./x + 1./x = 2./x сгенерирует одну ловушку, а не две, когда x = 0. Опция -ftrapping-math не предотвращает это.

Пожалуйста, приведите несколько примеров оптимизации, которая предотвращается с помощью -fno-trapping-math.

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

1 Ответ

0 голосов
/ 16 мая 2018

Простой пример выглядит следующим образом:

float foo()
{
    float a = 0;
    float nan = a/a;
    return nan;
}

Скомпилировано с GCC 7.3 для x64, на -O3:

foo():
  pxor xmm0, xmm0
  divss xmm0, xmm0
  ret

... что само собой разумеется.Обратите внимание, что он на самом деле делает div (несмотря на то, что знает, что 0/0 - это nan), что не особенно дешево!Это должно быть сделано, потому что ваш код может пытаться сознательно вызвать ловушку с плавающей запятой.

С -O3 -fno-signaling-nans -fno-trapping-math:

foo():
  movss xmm0, DWORD PTR .LC0[rip]
  ret
.LC0:
  .long 2143289344

То есть, просто загрузите NaN иверни это".Это идентичное поведение, , если вы не полагаетесь на ловушку .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...