Что может изменить мое управляющее слово с плавающей запятой за моей спиной?

У меня есть 32-битное приложение для Windows, написанное в основном на Delphi, которое выполняет численное моделирование с плавающей запятой, используя 8087 FPU. Недавно я добавил возможность подключать внешний код Python, используя Python API через python2x.dll. Это недавнее изменение привело к очень странному поведению.

Приложение имеет пакетный режим работы, в котором оно выполняет несколько симуляций параллельно, чтобы использовать преимущества многоядерных архитектур. Как только в процессе выполняется код Python, я начинаю видеть изменения в управляющем слове 8087 в разных потоках. Я проверил это очень тщательно и заметил, что управляющее слово изменилось даже в потоке, который никогда не обращался к библиотеке Python DLL.

Я знаю, что это звучит фантастически, но, как я обнаружил, существуют механизмы проявления такого поведения. Я узнал о сигналах. Сначала я предположил, что библиотека Python DLL устанавливает обработчики сигналов для всего процесса (вызывая signal()), и эти обработчики сигналов отвечают за изменение управляющего слова. Например, поток, не связанный с кодом Python, может вызвать SIGFPE, который, в свою очередь, может изменить управляющее слово.

Я скорее пришел к выводу, что signal() не является механизмом. Я организовал выполнение кода Python при запуске. Затем я установил обработчики сигналов обратно на SIG_DFL. Затем я запустил симуляцию. Но по-прежнему происходило изменение управляющего слова.

Мой вопрос (в заключение) заключается в том, знает ли кто-нибудь другой механизм, с помощью которого управляющее слово может быть изменено таким образом. Я ищу прерывания, APC и т.д., я думаю!

Обновление

Управляющее слово изменяется на 0x037F, что является значением Intel по умолчанию. Это отличается от значения по умолчанию MSVC/Windows 0x027F. Я предполагаю, что что-то вызывает FPINIT.

Я также обнаружил Py_InitializeEx который позволяет вызывающей стороне остановить Python, устанавливающий обработчики сигналов. Изменения управляющего слова происходят, даже если я использую этот подход к инициализации, поэтому я еще больше убежден, что дело не в этом механизме.

14
задан David Heffernan 7 October 2011 в 15:31
поделиться