问题标签 [fpu]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
iphone - iPhone 4 和 iPad 2:定点运算相对于浮点的优势
我听说 iPhone 4 和 iPad 有一个称为 VFP 的 fpu,它在某种程度上优化了浮点运算,甚至允许 SIMD(尽管 GCC 是否利用这一点值得怀疑)。但是,我读到对于某些 Android 设备,使用定点而不是浮点的加速可以导致性能提高 20 倍。
在这些设备中使用定点算术而不是浮点实现我的代码的浮点密集型部分有什么优势。
x86 - 通过内联 x86 将双精度值传递给函数
我无论如何都不是组装专业人士,并且在运行我的代码时收到以下错误:“运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。”
我目前正在使用 CPython 库将 C 样式函数绑定到 Python 3.2,并且在我的代码中遇到了传递双精度数的问题。我有一个模板函数,用于调用原型如下的 C 函数:
目前,我的方法适用于在 Python 和 C/C++ 之间传递整数类型,但我在使用双精度时遇到了问题。也许更精通 x86 汇编的人可以发现我做错了什么。我已经在我的代码段中提取了所有不涉及双精度的代码:
关于我使用的以下功能的澄清,可能不是每个人都清楚:
上述函数都是我围绕 CPython 方法编写的用于添加错误检查的包装器。
windows - 第三方代码正在修改 FPU 控制字
引言——冗长而乏味的部分
(问题在最后)
我对不断更改 FPU 控制字的第三方 COM 组件感到非常头疼。
我的开发环境是Windows和Visual C++ 2008。正常的FPU控制字指定在各种情况下不应该抛出异常。我已经通过查看中_CW_DEFAULT
找到的宏float.h
以及在启动时查看调试器中的控制字来验证这一点。
每次我调用 COM 对象时,控制字都会在返回时被修改。这很容易防御。我只是重置了控制字,一切都很好。问题是当 COM 组件开始调用我的事件接收器时。我可以通过在收到事件调用后立即重置控制字来保护我的代码,但是一旦我从事件调用返回,我就无法做任何事情。
我没有这个COM组件的源代码,但我正在与作者联系。我从他那里得到的回应是“嗯?”。我认为他根本不知道我在说什么,所以我担心我必须自己做点什么。我相信他的运行时(我认为它是 Delphi 或 Borland C++,因为 DLL 充满了符号名称,都以大写 T 开头),或者他正在使用的其他第三方代码,这导致了问题。我不认为他的代码明确修改了 FPU 控制字。
那么,我能做些什么呢?从业务的角度来看,必须使用这个第三方组件。从技术角度来看,我可以放弃它,自己实现通信协议。但是,这将非常昂贵,因为该协议涉及处理信用卡交易。我们不想承担责任。
我迫切需要一个 hack-around,或者一些关于 Borland 产品中 FPU 设置的有用信息,我可以将它们传递给组件的作者。
问题
有什么我可以做的吗?我不认为组件作者有能力修复它(从他相当无能的回答来看)。
我一直在玩弄安装我自己的异常处理程序的想法,我只是在处理程序中重置控制字,并告诉 Windows 继续执行。我尝试使用 安装处理程序SetUnhandledExceptionFilter()
,但由于某种原因,没有捕获到异常。
- 为什么我没有捕捉到异常?
- 如果我成功捕获 FPU 异常,重置 FPU 控制字,然后让执行继续,因为什么都没发生——那么所有的赌注都没有了吗?
更新
I would like to thank everyone for their suggestions. I have sent the author instructions on what he can do to make life easier for not just me, but many other clients of his code. I suggested to him that he should sample the FPU control word at DllMain(DLL_PROCESS_ATTACH)
, and save the control word for later, so that he can reset FPU CW before calling my event handlers, and returning from my calls.
For now, I have a hack-around if anyone is interested. The hack-around is potentially a bad one, because I don't know what it'll do to his code. I have received confirmation earlier that he does not use any floating point numbers in his code, so this should be safe, barring some third party code he uses, that relies on FPU exceptions.
The two modifications I have made to my app:
- Wrap my message pump
- 安装窗口挂钩 (
WH_CALLWNDPROC
) 以捕获绕过消息泵的角落案例
在这两种情况下,我都会检查 FPU CW 是否发生了变化。如果有,我将其重置为_CW_DEFAULT
.
android - Android NDK SIGILL 在 ARMv6 设备上的 fpu 指令上崩溃
我正在使用 APP_ABI=armeabi 编译一个 NDK 项目以针对 ARMv5 cpu。我有处理浮点的代码,当在低端 HTC Wildfire ARMv6 设备上运行时,我发现我遇到了 SIGILL 崩溃。
反汇编二进制文件显示它恰好在此处崩溃
为什么当我指定 APP_ABI=armeabi 时 NDK 生成 fp 指令,不应该是 eabi 调用,而不是明确的霓虹灯代码?为了排除故障,我什至将它添加到 mk 文件中:
然而它仍然会生成上面的二进制代码。我应该指定什么参数来确保我的浮点指令实际生成软代码?或者,这个设备是否完全坏了?这是CPU信息:
android - 在 Android 上检测 FPU 的存在
我想在 Android 上获得我的移动应用程序的最大性能。我想知道是否有人知道检查手机是否具有 FPU 的技巧。
经过一些研究,似乎FloatMath
在拥有 FPU 的单元上使用类会更慢,所以我希望两全其美。
大多数较新的手机都有 FPU,但我希望获得该设备可以提供的最高性能。
opcode - 解码特定 x87 FPU 指令的歧义
关于解码 x87 FPU 指令,我面临一个模棱两可的情况。查看以下指令,取自第 2A 卷英特尔指令集手册 [1] 的第 3-380 页。
这两条指令都具有相同的单字节基本操作码0xD9
。第一条指令的扩展操作码为0x00
. 扩展操作码将在 ModR/M 字节的“reg”字段中指定。但第二条指令是一个 2 字节的操作码,具有“添加以获取寄存器”功能。这意味着:
关于区分这两个指令,我有一个小问题。一个小例子是:
现在,假设我得到了操作码序列"D9 C1"
。如果我需要检查它是否是指令"FLD m32fp"
,那么我必须检查 ModR/M 字节的“reg”字段是否为 0x00。如果是这样,那么它确实是"FLD m32fp"
正在使用的指令。
的二进制表示C1
是"1100 0001"
。假设 bit0 为 LSB,则 bit3-bit5(含)构成 ModR/M 字节的“reg”字段"C1"
。我们看到它确实是0x00
(3 个零)。
所以我将操作码序列映射"D9 C1"
到"FLD m32fp"
指令。进一步解码,我们看到操作数实际上变成"ecx"
了这种情况。但是我们看到它"FLD ST1"
也有操作码序列"D9 C1"
,这是用于该操作码序列的实际指令。
本质上,我如何确定操作码序列"D9 C1"
对应于指令"FLD ST1"
而不是"FLD ecx"
?
指令也出现了非常相似的问题"FMUL"
,因为使用操作数的方式与"FLD"
此处相同。
[1] http://www.intel.com/design/intarch/manuals/243191.HTM
谢谢和问候,
Hrishikesh Murali
assembly - 装配。如何设置CW的RC位?
如何将RC中FPU位的控制字设置为3?
答案(编者注:不要将答案作为问题的一部分发布,但现在就在这里)
performance - 像素修改代码在主应用程序中运行很快,在 Delphi 6 DirectShow 过滤器中运行速度非常慢,还有其他问题
我有一个 Delphi 6 应用程序,它以每秒 25 帧的速度实时将位图发送到 DirectShow DLL。DirectShow DLL 也是我的代码,也是使用 DSPACK DirectShow 组件套件在 Delphi 6 中编写的。我有一个简单的代码块,它通过位图中的每个像素修改图像的亮度和对比度,如果设置了某个标志,否则位图被推出未修改的 DirectShow DLL(推送源视频过滤器)。该代码曾经位于主应用程序中,然后我将其移至 DirectShow DLL 中。当它在主应用程序中时,它运行良好。我可以按预期看到位图中的变化。但是,既然代码驻留在 DirectShow DLL 中,它就有以下问题:
当下面的代码块处于活动状态时,DirectShow DLL 真的很慢。我有一个四核 i5,它真的很慢。我还可以看到 CPU 消耗的大幅飙升。相比之下,在主应用程序中运行的相同代码在旧的单核 P4 上运行良好。它确实在那台旧机器上明显地击中了 CPU,但视频很流畅,没有任何问题。图像尺寸仅为 352 x 288 像素。
我没有看到可见位图的预期变化。我可以跟踪 DirectShow DLL 中的代码并查看代码正确更改的每个像素的数值,但图形编辑 ActiveMovie 窗口中的可视图像看起来完全没有变化。
如果我停用我可以实时执行的代码,ActiveMovie 窗口会显示像玻璃一样光滑的视频,在 CPU 几乎没有接触的情况下完美呈现。如果我重新激活代码,视频现在真的很不稳定,可能每秒只显示 1 到 2 帧,并且在显示第一帧之前有很长的延迟,并且 CPU 会出现峰值。不完全,但比我预期的要多得多。
我尝试使用包括范围检查、溢出检查等在内的所有内容编译 DirectShow DLL,并且在运行时没有警告或错误。然后我尝试以最快的速度进行编译,但它仍然存在上面列出的完全相同的问题。确实出了点问题,我不知道是什么。请注意,我确实在修改位图之前锁定了画布,并在完成后将其解锁。如果不是因为我上面提到的“一切都在”编译运行,我会说它感觉就像每次像素计算都会引发 FPU 异常并默默吞噬,但正如我所说,没有错误或异常正在发生。
更新:我将其放在这里,以便嵌入在 Roman R 的评论之一中的解决方案清晰可见。在访问 ScanLine 属性之前我没有将PixelFormat属性设置为pf24Bit的问题。正如 Roman 建议的那样,不这样做必须使 TBitmap 代码创建位图的临时副本。一旦我添加了下面的代码行,问题就消失了,更改不可见和软页面错误都消失了。这是一个隐蔽的问题,因为受影响的唯一对象是用于访问 ScanLine 属性的指针,因为(假设)它包含指向位图临时副本的指针。这就是为什么后续的 TextOut() 调用仍然有效的原因,因为它在位图的原始副本上工作。
这是我一直提到的代码块:
decimal - 十进制数学是否使用 FPU
十进制数学是否使用 FPU?
我认为答案是肯定的,但我不确定,因为小数不是浮点数,而是固定精度数。
我主要在寻找.NET,但一般的答案也会很有用。
assembly - fpu 以基于堆栈的方式实现其寄存器的动机是什么?
fpu 以基于堆栈的方式实现其寄存器的动机是什么?据我了解,其他指令集(例如 x86/sse)使用命名寄存器。我可以想象基于堆栈的属性通常与我们对函数的想法相对应,从而为汇编程序员带来更直观的设计。
但是我很好奇是否有一些更切实的动机,即技术优势。