2013-09-18 1 views
3

Мы пишем эмулятор и хотим знать, что для данного состояния FPU состояние FPU детерминировано после выполнения инструкции FPU, например. FDIV?Являются ли инструкции x87 FPU детерминированными?

Есть много совместимых с процессором процессоров Intel, которые реализуют набор инструкций x87. Должны ли мы полагаться на результирующее состояние процессора при проверке правильности нашей эмуляции FPU?

Существуют различные варианты реализации/вычисления по-разному?

ответ

5

Да, x87 FPU детерминирована для основных операций +, -, *, /, sqrt. Например, в своем состоянии по умолчанию (полноразмерный синусоидальный и округлый до ближайшего-четного) результат x + y является точно ближайшим представимым значением 80-битного значения с плавающей запятой к результату математической суммы x и y ,

Производители совместимых чипов внедрили то же определение для операций выше.

Набор инструкций x87 в чистой традиции CISC также содержит инструкции высокого уровня для вычисления математических функций, скажем, приближения синуса (FSIN). Результаты этих инструкций варьировались по брендам и моделям процессоров. В вашем эмуляторе вам, вероятно, нужно только предоставить что-то хорошее, как one of the worst implementations of these instructions все еще используется. Никто не должен жаловаться, если вы используете результат функции sinl() из математической библиотеки вашего языка хоста, которая обычно лучше, чем FSIN (в силу того, что она реализована с явными argument reduction и polynomial approximation, а не с вызовом FSIN).

+0

Почему FSQRT детерминированным, а FSIN нет? – Calmarius

+1

@Calmarius Поскольку в IEEE 754 были установлены +, -, *,/и квадратный корень, как операции, которые должны были возвращать правильно округленный результат. Их часто называют пятью «основными операциями».Внедрение правильно скругленного синуса чрезвычайно сложно, поэтому стандарт не дал ему мандата, поэтому разработчики могут обеспечить синусоидальную функцию, которая не имеет правильного округления или вообще не имеет функции синуса, и все еще вызывает их реализацию, совместимую с IEEE 754. –

+0

@Calmarius: для любого конкретного размера ввода и вывода возможно (и не сложно) построить функцию sqrt (x), которая будет знать, является ли ее результат, описанный выше, ниже или равным численно-совершенному значению. Если вы вычисляете результат, который на один бит длиннее предполагаемого результата, этот дополнительный бит и знание того, будет ли правильное значение выше или ниже представленного значения, будет достаточным для вычисления результата с любым желаемым режимом округления. Для sin (x) такое определение вообще невозможно. – supercat

2

Должно быть, если вы придерживаетесь основных инструкций FPU и используете один и тот же компилятор для своих алгоритмов FPU, если хотите, чтобы они дали согласованные результаты. Это не значит, что вам нужно правильно инициализировать библиотеку FPU.

Вот несколько хороших чтений на эту тему, если вам интересно: https://randomascii.wordpress.com/2013/07/16/floating-point-determinism.

Ссылки на другие статьи внутри этого документа являются исключительно полезными.

+1

Я думаю, что вопрос связан с эмуляцией FPU и что совет по получению согласованных результатов для исходного кода на платформах компиляции в значительной степени не имеет значения. –

+0

Отличная ссылка. – Michael

1

Как уже говорилось, основные пять операций будут давать одинаковые результаты на всех FPU x87. Однако ...

Особенность x87 FPU. Это 80-битные регистры означают, что он может получать результаты, отличные от других FPU (например, на PowerPC или ARM с 64-битными регистрами с плавающей запятой). Эти результаты могут быть лучше или хуже. Даже установка режима округления x87 на 32-битный или 64-разрядный не будет делать его таким же, как PowerPC/ARM, потому что экспонента остается неограниченной.

Для написания эмулятора это не имеет значения, за исключением того, что это означает, что вы не можете использовать хост FPU для эмуляции xpp F90. Я покрывал многие из этих вопросов в этих двух статьях:

http://randomascii.wordpress.com/2013/07/16/floating-point-determinism http://randomascii.wordpress.com/2012/03/21/intermediate-floating-point-precision/

 Смежные вопросы

  • Нет связанных вопросов^_^