我怎么知道命中组件指令的次数



我目前正在研究一个项目,在该项目中,我在汇编级别修改了一些程序。程序转换真的很简单,我只是在代码中的特定位置插入了一些掩盖操作。

我想知道执行了我的掩蔽说明有多少次对程序转换成本具有确切的想法。

当前我正在使用 gdb ,并且我设置了硬件断点我的掩盖说明所在的位置。之后,我可以使用 info brekaintss

获得断点的热门计数。

但是,GDB超级慢,即使经过一晚的计算,该程序也无法完成10次以下的时间。

我很确定我正在使用硬件断点,我总是设置不到4个(我在带有4个调试寄存器的英特尔处理器上运行)。

我的GDB版本是8.0。

我正在考虑使用探索器,我已经快速看了Valgrind,GCOV和GPROF,但似乎并不适合我的需求。

有人知道任何可以帮助我的工具吗?还是有人知道如何使用GDB加快我的想法?

谢谢

编辑:我在Linux X86-64上运行

有人知道任何可以帮助我的工具吗?

您可以尝试perf annotate。perf中有一个例子教程:

可以通过perf钻至教学水平 注释。为此,您需要用名称来调用perf注释 注释的命令。所有带有样品的功能将是 拆卸,每个说明的相对百分比为 样本报告:

perf record ./noploop 5
perf annotate -d ./noploop
------------------------------------------------
 Percent |   Source code & Disassembly of noploop.noggdb
------------------------------------------------
         :
         :
         :
         :   Disassembly of section .text:
         :
         :   08048484 <main>:
    0.00 :    8048484:       55                      push   %ebp
    0.00 :    8048485:       89 e5                   mov    %esp,%ebp
[...]
    0.00 :    8048530:       eb 0b                   jmp    804853d <main+0xb9>
   15.08 :    8048532:       8b 44 24 2c             mov    0x2c(%esp),%eax
    0.00 :    8048536:       83 c0 01                add    $0x1,%eax
   14.52 :    8048539:       89 44 24 2c             mov    %eax,0x2c(%esp)
   14.27 :    804853d:       8b 44 24 2c             mov    0x2c(%esp),%eax
   56.13 :    8048541:       3d ff e0 f5 05          cmp    $0x5f5e0ff,%eax
    0.00 :    8048546:       76 ea                   jbe    8048532 <main+0xae>
[...]

第一列报告了功能的样本百分比 == noploop()==在该指令上捕获。如前所述,您应该仔细解释此信息。

每次击中其中一个断点之一时,它必须停止程序并在GDB中做某事。所以自然需要永远。

我将使用GDB,但不使用断点。我只是手动将其随机停止(或者您可以使用计时器)。每次停止时,您都可以准确地看到它是什么指令。如果您这样做10或20次,您可以轻松估算每次指令所花费的时间的比例(换句话说,该指令总数的总时间是多少),并且您可以看到它如何随您的掩蔽而变化。p>除非您得到很多样本,否则您不会得到真正精确的时间分数,但是您所做的是非常可靠的。

然后, gprof也应该做您想做的事情,就像我讨厌承认的那样:)

gdb与它无关,您必须依靠硬件/芯片提供的内容。首先,您不计算汇编指令多少次是因为处理器不直接理解汇编,但他们了解机器代码,尽管并非所有的汇编指令映射到一台机器指令,但您必须按照情况为基础。因此,除非术语,否则您必须依靠硅。

下一个定义命中,需要许多时钟周期来处理和执行指令,具体取决于设计,许多指令开始看到管道的早期阶段,直到处理器发现一个分支正在发生,说明了一个分支条件分支。我认为您对那些不感兴趣(断点和停止程序的流量与运行程序的流程不同,它会改变程序的运行方式,您在断点的阴影中强迫说明至少击中两倍就像他们通常会根据您对命中一词的含义的定义一样。

断点仅在处理器支持时才有效,您通常可以始终在其中包含一个未定义的指令,并在处理器支持的情况下,有一个未定义的处理程序(这都是通用的,您使用的是哪种处理器,尤其是无关的,尤其是因为它似乎是x86,这意味着此时有许多不同的实现,x86-64尚未开始描述完整答案所需的详细信息)

一些处理器根本没有提供调试支持,充其量是不确定的说明,并希望它有效。有些人有很多东西,其余部分在中间,有些则提供您要求观看特定地址和计数器的"执行"的功能。通常,答案将是断点,恢复并计算您唯一的选择。当然,有这样的原因,计算一个指令被击中多少次与循环的整体性能无关,有时,如果它是触摸说明中记忆的唯一一个,而是该说明或循环的对齐有时会播放比机器代码本身更大的角色……因此,想知道您如何达到需要在特定指令上计算"命中"的地步。(您也应该仅通过分析代码来做到这一点)。

最新更新