我用C语言编写了一个程序,这是一项研究的结果。我想计算程序消耗的精确CPU周期数。有什么方法可以找到吗?
我用C语言编写了一个程序,这是一项研究的结果。我想计算程序消耗的精确CPU周期数。有什么方法可以找到吗?
valgrind
工具 cachegrind
(valgrind --tool=cachegrind
)将提供详细的输出,包括执行的指令数量、缓存未命中和分支预测未命中。这些可以追溯到单独的汇编行,因此原则上(如果您了解您的确切架构),您可以从此输出获得精确的周期计数。不行。"CPU周期"的概念没有被明确定义。现代芯片可以以多个时钟速率运行,并且它们的不同部分可以在不同时间做不同的事情。
“有多少总管道步骤”的问题在某些情况下可能是有意义的,但很可能没有办法得到它。
试试OProfile。它使用CPU上的各种硬件计数器来测量执行的指令数量和经过的周期数。您可以在文章Memory part 7: Memory performance tools中看到其使用示例。
我并不完全确定您想做什么,但在现代x86处理器上可以做的是在您感兴趣的代码块之前和之后读取时间戳计数器(TSC)。在汇编级别上,使用RDTSC
指令来完成这项工作,它会将TSC的值放入edx:eax
寄存器对中。
然而,请注意此方法有一些注意事项,例如,如果您的进程从CPU0启动并最终在CPU1上结束,则从RDTSC
获得的结果将引用执行该指令的特定处理器核心,因此可能无法进行比较。(还存在RDTSC
缺乏指令序列化的问题,但在这种情况下,我认为这不是太大的问题。)
抱歉,但对于大多数实际目的来说不可能,至少对于大多数常规操作系统而言是不可能的。例如,相当多的操作系统在处理中断时不会进行完整的上下文切换,因此处理中断所花费的时间,通常会看起来像是发生中断时正在执行的进程所花费的时间。
"对于实际目的来说不可能"意味着可能在一个周期精确的模拟器下运行您的程序。这些模拟器虽然存在,但主要用于实时嵌入式系统中使用的CPU,并非全功能PC等设备。更糟糕的是,它们(一般)并不适用于运行像全功能操作系统那样的代码,而是适用于运行在“裸机”上的代码。
从理论上讲,您可能可以通过运行类似于Windows或Linux的虚拟机来实现某些功能,但我不知道是否有现有的虚拟机尝试过,并且这肯定是一个非常棘手的问题,可能会对性能产生相当严重的影响。(委婉地说)