PolyBench Suite的x86分解中的浮点指令

问题描述 投票:0回答:1

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

由于某种原因,与所有其他指令类别(如二进制,加载,存储,nop等)不同,我对所有程序将其设为零。我使用objdump分解了二进制文件,看不到带有从f开始的操作码的一行。

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

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

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

x86 disassembly dynamic-analysis
1个回答
0
投票

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

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

  • 同一二进制文件必须支持20年前的不支持SSE的CPU。这意味着它是32位代码而不是64位代码(因为对于SSE而言太旧的CPU也不支持64位)。
  • 使用SSE会由于任务切换成本(任务切换期间保存/加载SSE状态的成本)而降低性能。这不适用于大多数情况;要么是因为操作系统保存/加载了SSE状态,而不管它是否被使用;或因为SSE仍然用于其他用途(例如SIMD)。
  • 您需要扩展的80位浮点精度。这几乎不会发生-在“ 64位(或更少)就足够了”和“ 80位还不够”之间有一个很小的利基。
  • 您需要执行sin()sqrt()之类的操作,或使用BCD,但是代码大小比性能重要得多。这是极不可能的。
© www.soinside.com 2019 - 2024. All rights reserved.