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