【问题标题】:Let a task run for a fixed number of instructions?让任务运行固定数量的指令?
【发布时间】:2015-09-17 14:30:36
【问题描述】:

是否可以在将控制权返回给用户之前安排给定任务准确运行 n 机器指令?

这个问题的动机是调试多线程程序,这可能有助于可靠地重现某些错误或未定义的行为。

我对在 Intel CPU 上运行的 x86_64-linux 的情况特别感兴趣,但其他架构或操作系统的解决方案也会很有趣。

内核perf套件的文档说

性能计数器是大多数现代设备上可用的特殊硬件寄存器 CPU。这些寄存器计算某些类型的硬件事件的数量:例如 随着指令的执行、缓存未命中或错误预测的分支 - 不会减慢内核或应用程序的速度。这些寄存器也可以 当事件数量达到阈值时触发中断。

所以看起来硬件原则上可以支持这一点,但我不确定这是否以任何方式暴露给用户。

当然可以只使用ptrace 来单步执行程序n 次,但这会使除了最简单的程序之外的所有程序都非常慢。

【问题讨论】:

  • 我质疑具有多级缓存、非顺序一致性内存模型和可变 cpu 频率的流水线超标量乱序 cpu 上的简单指令计数的相关性。
  • 棘手或困难在于大多数处理器都有按时间中断的功能(通常是在计时器到期时),而不是用于指令计数。您将必须检查您的平台,以查看存在哪些指令计数功能。接下来,检查您的操作系统是否为此提供了 API 或中断处理程序(当指令计数器转换为零时将调用 ISR)。

标签: c++ c linux multithreading


【解决方案1】:

确保执行指令的准确计数的一个简单选项是检测汇编代码并维护一个执行计数器。我相信最简单的检测方法是Pin (https://software.intel.com/en-us/articles/pintool)。

高级想法: - 解释机器代码并维护执行指令数量的计数器,

  • 在每条指令之后,您递增计数器并检查是否到了断点时间,

  • 在每个断点后重置计数器。

解释的想法会引入相当多的开销。我看到了一些直接的优化:

  • 静态检测二进制文件(创建一个新的二进制文件,所有这些增量/检查都是硬编码的)。这种方法将消除仪器/解释开销。您可以将与监控/断点相关的指令视为执行的额外指令或选择从计数中忽略它们。

  • 可以更智能地实现增量/检查。想象一下,我们有一组没有跳转/分支的指令,您可以进行一次增量和一次检查。这个想法很简单,但在实践中可能会非常棘手,尤其是当您需要一个绝对准确的断点时..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-14
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多