Что определяет настройку по умолчанию для управляющего слова x87 FPU? - PullRequest
1 голос
/ 31 марта 2010

Что определяет настройку по умолчанию для управляющего слова x87 FPU, в частности, для поля контроля точности? Компилятор устанавливает его на основе целевого процессора? Есть ли опция компилятора, чтобы изменить его?

При использовании Microsoft Visual C ++ 2008 Express Edition на процессоре Intel Core Duo значением по умолчанию для поля контроля точности является «01b», что означает двойную (53-битную) точность. Мне интересно - почему по умолчанию не "11" b или расширенная (64-битная) точность?

(я знаю, что могу изменить его с помощью _controlfp.)

Ответы [ 4 ]

2 голосов
/ 11 марта 2011

В DLL времени выполнения Microsoft C (MSVCRT.DLL) была ошибка, из-за которой происходило изменение FPCW, что могло изменить поведение приложения в зависимости от порядка загрузки DLL.

Так что, если вам небезразлична настройка FPCW, рекомендуется не только изменить ее на желаемые настройки перед выполнением (даже на границе вызова функции), но и изменить ее, когда вы закончите. (И если вы вызываете какие-либо функции или библиотеки, остерегайтесь вызываемых абонентов, которые могут их изменить, и не будьте настолько внимательны, чтобы вернуть их обратно вам!)

Также обратите внимание: FPCW является дорогостоящим для модификации, но не очень дорогим для изучения. Так что, если есть хороший шанс, что он уже настроен так, как вы хотите, вы можете сэкономить много времени, проверив его перед изменением.

0 голосов
/ 22 марта 2013

Я задавался вопросом об одном и том же оригинальном вопросе. Я экспериментировал с VC ++ 6 и MinGW в Windows 2000 (32-разрядная версия).

В простой трехстрочной программе было установлено управляющее слово FPU для «Двойная точность» (0x027f) для VC ++ и «Расширенная точность» при компиляции с использованием MinGW (0x037f). На той же машине gcc / Linux-32 имела такую ​​же расширенную точность (0x37f). то есть MinGW и gcc / Linux, похоже, имеют одинаковые настройки FPU.

0 голосов
/ 18 февраля 2011

Когда ОС устанавливает процесс (или поток), скажем, когда ваша программа запускается, она отвечает за инициализацию управляющих регистров в состояние по умолчанию (то, что состояние по умолчанию может несколько отличаться от платформы к платформе) , Он также отвечает за сохранение и восстановление состояния вокруг переключателей контекста, чтобы ваша программа не перенаправляла состояние в какой-либо другой процесс, который также выполняется в системе.

Кроме того, компилятор или среда исполнения языка могут изменять состояние до выполнения вашего кода.

Так что либо: Состояние FP по умолчанию в Windows имеет точность 53 бита, или VS2008 вставляет код, чтобы установить для процессора точность 53 бита по умолчанию. Состояние процесса Windows по умолчанию должно быть задокументировано в документации ABI для платформы.

0 голосов
/ 31 марта 2010

С теоретической точки зрения: вероятно, последнее, что использовало его, или запретил, что бы ни решил Intel, будет хорошим значением по умолчанию.

С практической точки зрения: просто установите желаемую точность перед началом работы. Явные значения по умолчанию обычно лучше, чем подразумеваемые значения по умолчанию.

...