Можно ли повысить точность арифтемтики с плавающей точкой с GCC?
-
04-10-2019 - |
Вопрос
Некоторая программа в C, которая делает обширные расчеты с плавающей запятой, получают правильные результаты на коробке PC Linux, а неправильные результаты на SPE к сотовым процессоре, но не на PPU клетки. Я использую компиляторы GCC. Интересно, есть ли вариант компиляции GCC для увеличения метода округления или аналогичным образом, поэтому я получаю расчеты прецизионных поплавок с более точностью. Я не могу изменить на двойной, так как на спектакле SPE решит восстановить
Спасибо
Решение
На основе IBM Документация для различий от IEEE 754 на SPU, это может быть любое количество вещей:
- Ноль результатов арифметических операций всегда +0, никогда -0.
- Деномальные входы от 2-149 до 2-126 до арифметических операций рассматриваются как ноль с одинаковым знаком. Арифметические операции никогда не вызывают денормальные результаты, но вместо этого производят +0.
- Арифметические операции не поддерживают IEEE INF или NAN. Эти битовые шаблоны представляют собой действительные числа. Результаты переполнения дают максимальное значение величины соответствующего знака.
- Арифметические операции используют только режим округления округления круглой до нуля (отбивной, усеченной), независимо от настройки режима округления в состоянии состояния и управления с плавающей точкой (FPSCR), который влияет только на арифметические операции двойной точности.
Конечно, на связанной странице, Вы также можете компилировать код SPU для строгого соответствия IEEE:
По умолчанию XL C / C ++ следует больше всего, но не все правила в стандарте IEEE. Если вы компилируетесь с вариантом -qnoStrict, который включен по умолчанию на уровне оптимизации -O3 или выше, некоторые правила с плавающей запятой IEEE нарушаются способами, которые могут повысить производительность, но может повлиять на правильность программы. Чтобы избежать этой проблемы и скомпилировать строгое соответствие стандарту IEEE, выполните следующие действия:
- Используйте опцию компилятора -QLOAT = NOMAF.
- Если программа изменяет режим округления во время выполнения, используйте опцию -qfloat = RRM.
- Если данные или код программы содержат сигнальные значения NAN (Nans), используйте опцию -qfloat = Nans. (Сигнализация NAN отличается от тихого NAN; вы должны явно кодировать его в программу или данные или создавать его с помощью опции компилятора -QINITAUTO.)
- Если вы скомпилируетесь с3, -O4, или -O5, включите опцию -Qstrict после него.