Можно ли повысить точность арифметики с плавающей точкой с помощью gcc? - PullRequest
3 голосов
/ 23 сентября 2010

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

Спасибо

1 Ответ

1 голос
/ 23 сентября 2010

Основываясь на документации 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.
...