PolyBench Suite x86 反汇编中的浮点指令

Floating Point Instructions in x86 Disassembly of PolyBench Suite

我正在尝试计算 CPU 在 GCC 使用 pin 工具为 poly bench 基准测试中的 30 个不同程序创建的二进制文件中执行的动态浮点指令的数量。根据 x86 编码器-解码器 (XED) 文档,x86 中的所有浮动指令都在 X87_ALU 类别下。

出于某种原因,我将所有程序的它设置为零,这与所有其他指令类别(如二进制、加载、存储、nop 等)不同。 我使用 objdump 分解了二进制文件,但看不到操作码从 f.

开始的一行

此外,我为所有使用 emscripten (emcc) 的程序生成了 web assembly (.wasm) 二进制文件,然后将 .wasm 二进制文件转换为反汇编的 .wat 文件。在这些文件中,我也没有看到任何浮点指令。

PS: 从我一直在做的 google 搜索中,我了解到 x86 有一个完全不同的浮点单元和基于堆栈的处理。也许我在这方面遗漏了什么?

关于如何在反汇编的二进制文件中查看浮点指令的任何线索?

几乎所有的现代代码都不使用 FPU,而是使用标量 SSE。

使用 FPU(而不是标量 SSE)的原因是:

  • 相同的二进制文件必须支持 20 年前不支持 SSE 的 CPU。这意味着它是 32 位代码而不是 64 位代码(因为对于 SSE 来说太旧的 CPU 也不支持 64 位)。
  • 由于任务切换成本增加(saving/loading SSE 状态在任务切换期间的成本),使用 SSE 会损害性能。这不适用于大多数情况;要么是因为操作系统 saves/loads SSE 状态不管它是否被使用;或者因为 SSE 无论如何都用于其他事情(例如 SIMD)。
  • 您需要 80 位浮点的扩展精度。这通常不会发生 - 在“64 位(或更少)就足够”和“80 位不够”之间存在一个小的利基市场。
  • 您需要执行 sin()sqrt() 之类的操作,或者使用 BCD,但代码大小比性能重要得多。这是极不可能的。