0

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

出于某种原因,我将所有程序的它都设为零,这与二进制、加载、存储、nop 等所有其他指令类别不同。我使用 objdump 对二进制文件进行了反汇编,并且看不到带有操作码开始的单行从 f.

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

PS:从我一直在做的谷歌搜索中,我了解到 x86 对这些具有完全不同的浮点单元和基于堆栈的处理。也许我在这方面遗漏了一些东西?

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

4

1 回答 1

1

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

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

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