Можно ли повысить точность арифметики с плавающей точкой с помощью gcc?

Некоторые программы на C, которые выполняют обширные вычисления с плавающей запятой, получают правильные результаты на компьютере с Linux linux, но неправильные результаты на SPE процессора ячейки, но не на PPU ячейки. Я использую компиляторы gcc. Интересно, есть ли какая-нибудь опция компиляции gcc для увеличения метода округления или подобного, поэтому я получаю вычисления точности с плавающей запятой с большей точностью. Я не могу изменить в два раза, так как на SPE производительность резко снизится

Спасибо

1 ответ

Решение

Основываясь на документации IBM об отличиях от IEEE 754 для SPU, это может быть несколько вещей:

  • Нулевые результаты от арифметических операций всегда +0, никогда -0.
  • Денормальные входы от 2-149 до 2-126 в арифметические операции рассматриваются как ноль с тем же знаком. Арифметические операции никогда не дают денормализованных результатов, но вместо этого дают +0.
  • Арифметические операции не поддерживают IEEE Inf или NaN. Эти битовые комбинации представляют действительные числа. Результаты переполнения дают значение максимальной величины соответствующего знака.
  • Арифметические операции используют только режим округления до нуля (chop, truncate) независимо от настройки режима округления в регистре состояния и управления с плавающей запятой (FPSCR), который влияет только на арифметические операции с двойной точностью.

Конечно, на связанной странице вы также можете скомпилировать код SPU для строгого соответствия IEEE:

По умолчанию XL C/C++ следует большинству, но не всем правилам стандарта IEEE. Если вы компилируете с опцией -qnostrict, которая включена по умолчанию на уровне оптимизации -O3 или выше, некоторые правила IEEE с плавающей запятой нарушаются способами, которые могут повысить производительность, но могут повлиять на правильность программы. Чтобы избежать этой проблемы и собрать для строгого соответствия стандарту IEEE, сделайте следующее:

  • Используйте опцию -qfloat=nomaf compiler.
  • Если программа меняет режим округления во время выполнения, используйте параметр -qfloat=rrm.
  • Если данные или программный код содержат сигнальные значения NaN (NaNS), используйте параметр -qfloat=nans. (Сигнальный NaN отличается от тихого NaN; вы должны явно закодировать его в программу или данные или создать его с помощью параметра компилятора -qinitauto.)
  • Если вы компилируете с -O3, -O4 или -O5, включите опцию -qstrict после него.
Другие вопросы по тегам