【问题标题】:Measuring CPU clocks consumed by a process测量进程消耗的 CPU 时钟
【发布时间】:2011-02-05 00:13:09
【问题描述】:

我已经用 C 编写了一个程序。它是一个作为研究结果创建的程序。我想计算程序消耗的确切 CPU 周期。确切的周期数。 知道如何找到吗?

【问题讨论】:

标签: c process cpu cpu-cycles


【解决方案1】:

不,你不能。 “CPU 周期”的概念没有得到很好的定义。现代芯片可以以多种时钟速率运行,它们的不同部分可以在不同的时间做不同的事情。

“有多少总流水线步骤”的问题在某些情况下可能是有意义的,但不太可能有办法得到它。

【讨论】:

    【解决方案2】:

    抱歉,不,至少不是出于大多数实际目的 - 大多数普通操作系统根本不可能。例如,相当多的操作系统不会执行完整的上下文切换来处理中断,因此服务中断所花费的时间可以而且通常看起来是在中断发生时执行的任何进程所花费的时间。

    “不用于实际目的”表示在循环精确模拟器下运行程序的可能性。这些都是可用的,但主要用于主要用于实时嵌入式系统的 CPU,而不是像成熟的 PC 这样的任何东西。更糟糕的是,它们(通常)不是用来运行像成熟操作系统这样的东西,而是用于在“裸机”上运行的代码。

    理论上,您也许可以使用运行 Windows 或 Linux 之类的虚拟机来做某事——但我不知道有任何现有的虚拟机尝试这样做,而且这绝对不是微不足道的,而且可能对性能也有相当严重的影响(委婉地说)。

    【讨论】:

      【解决方案3】:

      valgrind 工具cachegrind (valgrind --tool=cachegrind) 将为您提供详细的输出,包括执行的指令数、缓存未命中和分支预测未命中。这些可以归结为汇编程序的各个行,因此原则上(在了解您的确切架构的情况下)您可以从此输出中得出精确的循环计数。

      知道由于缓存的影响,它会随着执行而改变。

      cachegrind tool is here 的文档。

      【讨论】:

        【解决方案4】:

        试试OProfile。它使用 CPU 上的各种硬件计数器来测量执行的指令数量以及经过了多少个周期。您可以在文章Memory part 7: Memory performance tools 中看到它的使用示例。

        【讨论】:

          【解决方案5】:

          我不完全确定我确切地知道您要做什么,但是在现代 x86 处理器上可以做的是在您感兴趣的代码块之前和之后读取 time stamp counter (TSC)在汇编级别上,这是使用RDTSC 指令完成的,它为您提供edx:eax 寄存器对中的TSC 值。

          但是请注意,这种方法有一些注意事项,例如如果您的进程在 CPU0 上开始并在 CPU1 上结束,则您从RDTSC 获得的结果将引用执行指令的特定处理器内核,因此可能无法比较。 (RDTSC 也缺少指令序列化,但在这种情况下,我认为这不是什么大问题。)

          【讨论】:

            猜你喜欢
            • 2017-10-01
            • 1970-01-01
            • 2015-07-19
            • 2015-02-05
            • 2011-08-12
            • 1970-01-01
            • 2010-10-12
            • 1970-01-01
            • 2021-10-18
            相关资源
            最近更新 更多