什么可以改变我背后的浮点控制字?

Dav*_*nan 14 c python windows delphi floating-point

我有一个32位Windows应用程序,主要用Delphi编写,它使用8087 FPU执行浮点数值模拟.我最近添加了通过python2x.dll使用Python API链接外部Python代码的功能.最近的这一变化导致了一些非常奇怪的行为.

该应用程序具有批处理操作模式,可并行执行多个模拟以利用多核架构.一旦在此过程中执行了Python代码,我就开始在不同的线程上看到对8087控制字的更改.我已经仔细检查了这一点,我观察到控制字已经改变了,即使在一个从未调用过Python DLL的线程中也是如此.

我知道这听起来很奇妙,但是,正如我所发现的那样,有一些机制可以表明这种行为.我已经了解了信号.我首先假设Python DLL正在设置进程范围的信号处理程序(通过调用signal()),这些信号处理程序负责更改控制字.例如,与Python代码无关的线程可能会导致SIGFPE并且可能反过来修改控制字.

我宁愿得出signal()不是机制的结论.我安排在启动时执行Python代码.然后我将信号处理程序设置回来SIG_DFL.然后我开始模拟.但仍然发生了控制字的变化.

我的问题(最后)是否有人知道可以通过这种方式改变控制字的另一种机制.我想要寻找中断,APC等等!

更新

控制字正在更改为0x037FIntel默认值.这与MSVC/Windows默认值不同0x027F.我假设某事正在呼唤FPINIT.

我还发现Py_InitializeEx允许调用者停止Python设置信号处理程序.即使我使用这种方法进行初始化,控制字也会发生变化,因此我更加确信这不是机制.

klu*_*udg 5

例如,DllMain带有DLL_THREAD_ATTACH标志的调用,请参阅msdn

更新

我找到了类似问题的链接 - DLL Load"Poisons"FPU Control Word for New Threads.但是,是的,它是关于Dll加载创建的线程.