我花了点时间,但是如果我用谷歌搜索,我只会得到时钟速度的定义。该软件如何确定CPU的当前时钟速度?有针对它的具体说明吗?
EDIT 看来,这个问题已经有了答案,我看上去还不够深入。
答案 0 :(得分:1)
据我所知;对于所有现有的CPU,都无法测量CPU的瞬时时钟速度。
您可以获得的最接近(取决于它是哪个CPU)是在很短的时间内找到平均时钟速度。例如,对于现代80x86 CPU,您可以设置一个性能监视计数器以测量“非暂停(CPU)时钟周期”,然后使用TSC(以“标称”固定频率运行,与CPU周期无关)计算“ CPU周期/时间”。当然,这涉及到“精度与持续时间”的折衷(持续时间越长,精度越高;持续时间越短,精度越低)。
另一个问题是,信息将在您使用之前过时。例如,CPU的速度可以在确定CPU速度之前立即改变,也可以在确定CPU速度之后立即再次改变。并且如果您可以在某个时间点(测量时)知道确切的CPU速度,则该信息将毫无价值,因为它并不暗示任何其他时间点(在测量时)。
为防止这种情况,您真正想要的是CPU速度变化的日志(例如,当CPU速度变化时,请在日志中添加一个包含时间戳和新速度的条目),以便您可以使用该日志来确定哪个CPU速度是过去的任何时候。在某些情况下,这是可能的(例如,如果软件本身改变CPU速度,或者如果本地APIC配置为生成“热监控器IRQ”,则软件可以将相关条目添加到日志中)。可悲的是,在其他情况下(“涡轮增压”),这是不可能的(速度变化不会通知软件)。
另一个问题是您假设CPU的时钟速度是一个。尽管过去确实如此,但现在不再如此,可以合理地预期将来它将变得“越来越不真实”。例如;现代的80x86 CPU通常有一个用于通用指令的时钟和一个用于SIMD(例如AVX)的时钟,其中(当不使用AVX指令时)CPU可以/将减少“ AVX时钟”以减少功耗(然后降低功耗)。当您开始使用AVX指令时,将需要几千个周期才能使“ AVX时钟”恢复全速。从理论上讲,CPU可以划分为任意数量的域,每个域都有自己的独立时钟。
当然,还有异步CPU设计(请参阅https://en.wikipedia.org/wiki/Asynchronous_circuit#Asynchronous_CPU),而这些设计根本没有时钟开始。