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等等!
更新
控制字正在更改为0x037F
Intel默认值.这与MSVC/Windows默认值不同0x027F
.我假设某事正在呼唤FPINIT
.
我还发现Py_InitializeEx
允许调用者停止Python设置信号处理程序.即使我使用这种方法进行初始化,控制字也会发生变化,因此我更加确信这不是机制.
例如,DllMain
带有DLL_THREAD_ATTACH
标志的调用,请参阅msdn
更新
我找到了类似问题的链接 - DLL Load"Poisons"FPU Control Word for New Threads.但是,是的,它是关于Dll加载后创建的线程.
归档时间: |
|
查看次数: |
1048 次 |
最近记录: |