我用 C 编写了一个程序。它是一个作为研究结果创建的程序。我想计算程序消耗的确切 CPU 周期。确切的周期数。知道我怎么能找到那个吗?
5 回答
该valgrind
工具cachegrind
( valgrind --tool=cachegrind
) 将为您提供详细的输出,包括执行的指令数、缓存未命中和分支预测未命中。这些可以归结为汇编程序的各个行,因此原则上(在了解您的确切架构的情况下)您可以从此输出中得出精确的循环计数。
知道由于缓存效应,它会随着执行而改变。
cachegrind 工具的文档在这里。
尝试OProfile。它使用 CPU 上的各种硬件计数器来测量执行的指令数量以及经过了多少个周期。您可以在文章Memory part 7: Memory performance tools中看到它的使用示例。
我不完全确定我确切地知道您要做什么,但是在现代 x86 处理器上可以做的是在您感兴趣的代码块之前和之后读取时间戳计数器(TSC)。汇编级别,这是使用指令完成的,该指令为您提供寄存器对RDTSC
中 TSC 的值。edx:eax
但是请注意,这种方法有一些注意事项,例如,如果您的进程在 CPU0 上开始并在 CPU1 上结束,那么您从中获得的结果RDTSC
将引用执行指令的特定处理器内核,因此可能无法比较。(也缺少使用 的指令序列化RDTSC
,但在这种情况下,我认为这不是什么大问题。)
不,你不能。“CPU 周期”的概念没有得到很好的定义。现代芯片可以以多种时钟速率运行,它们的不同部分可以在不同的时间做不同的事情。
在某些情况下,“有多少总管道步骤”的问题可能是有意义的,但不太可能有办法得到它。
对不起,但不,至少不是出于大多数实际目的 - 大多数普通操作系统根本不可能。例如,相当多的操作系统不会执行完整的上下文切换来处理中断,因此服务中断所花费的时间可以而且通常看起来是在中断发生时执行的任何进程所花费的时间。
“不用于实际目的”表示在循环精确模拟器下运行程序的可能性。这些都是可用的,但主要用于主要用于实时嵌入式系统的 CPU,而不是像成熟的 PC 这样的任何东西。更糟糕的是,它们(通常)不是用来运行像成熟操作系统这样的东西,而是用于在“裸机”上运行的代码。
从理论上讲,您可能可以使用运行 Windows 或 Linux 之类的虚拟机来做某事——但我不知道有任何现有的虚拟机会尝试这样做,而且这绝对不是微不足道的,而且可能非常严重性能方面的后果(委婉地说)。