衡量进程消耗的CPU时钟

4

我用C语言编写了一个程序,这是一项研究的结果。我想计算程序消耗的精确CPU周期数。有什么方法可以找到吗?


精确。那么,优化指令流并可能重叠指令的处理器算什么?http://software.intel.com/en-us/articles/branch-and-loop-reorganization-to-prevent-mispredicts/ - S.Lott
5个回答

13
valgrind工具 cachegrindvalgrind --tool=cachegrind)将提供详细的输出,包括执行的指令数量、缓存未命中和分支预测未命中。这些可以追溯到单独的汇编行,因此原则上(如果您了解您的确切架构),您可以从此输出获得精确的周期计数。
请注意,由于缓存效应,它会在每次运行时发生变化。 cachegrind工具的文档在这里

1

不行。"CPU周期"的概念没有被明确定义。现代芯片可以以多个时钟速率运行,并且它们的不同部分可以在不同时间做不同的事情。

“有多少总管道步骤”的问题在某些情况下可能是有意义的,但很可能没有办法得到它。


1

1

我并不完全确定您想做什么,但在现代x86处理器上可以做的是在您感兴趣的代码块之前和之后读取时间戳计数器(TSC)。在汇编级别上,使用RDTSC指令来完成这项工作,它会将TSC的值放入edx:eax寄存器对中。

然而,请注意此方法有一些注意事项,例如,如果您的进程从CPU0启动并最终在CPU1上结束,则从RDTSC获得的结果将引用执行该指令的特定处理器核心,因此可能无法进行比较。(还存在RDTSC缺乏指令序列化的问题,但在这种情况下,我认为这不是太大的问题。)


0

抱歉,但对于大多数实际目的来说不可能,至少对于大多数常规操作系统而言是不可能的。例如,相当多的操作系统在处理中断时不会进行完整的上下文切换,因此处理中断所花费的时间,通常会看起来像是发生中断时正在执行的进程所花费的时间。

"对于实际目的来说不可能"意味着可能在一个周期精确的模拟器下运行您的程序。这些模拟器虽然存在,但主要用于实时嵌入式系统中使用的CPU,并非全功能PC等设备。更糟糕的是,它们(一般)并不适用于运行像全功能操作系统那样的代码,而是适用于运行在“裸机”上的代码。

从理论上讲,您可能可以通过运行类似于Windows或Linux的虚拟机来实现某些功能,但我不知道是否有现有的虚拟机尝试过,并且这肯定是一个非常棘手的问题,可能会对性能产生相当严重的影响。(委婉地说)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接