用于测量处理器频率的常用算法有哪些?
Core Duo支持两个名为IA32_MPERF和IA32_APERF的特定于模型的寄存器后的Intel CPU.
MPERF以CPU支持的最大频率计数,而APERF以实际当前频率计数.
实际频率由下式给出:
您可以使用此流程阅读它们
; read MPERF mov ecx, 0xe7 rdmsr mov mperf_var_lo, eax mov mperf_var_hi, edx ; read APERF mov ecx, 0xe8 rdmsr mov aperf_var_lo, eax mov aperf_var_hi, edx
但请注意,rdmsr是一个特权指令,只能在ring 0中运行.
我不知道操作系统是否提供了读取这些内容的接口,尽管它们主要用于电源管理,因此它可能不提供这样的接口.
我将在这个答案中与各种细节约会,但是到底是什么......
几年前我不得不在基于Windows的PC上解决这个问题,因此我正在处理像486,Pentium等Intel x86系列处理器.在这种情况下,标准算法是执行一系列DIVide指令,因为这些指令通常是Intel集中最受CPU限制的单指令.因此,内存预取和其他体系结构问题不会对指令执行时间产生重大影响 - 预取队列始终为满,指令本身不会触及任何其他内存.
你可以使用你可以在你运行的环境中访问的最高分辨率时钟来计时.(在我的情况下,我在兼容PC的启动时间附近运行,所以我直接在主板上编程定时器芯片.在真实操作系统中推荐,通常这些天可以使用一些适当的API来调用.
您必须处理的主要问题是不同的CPU类型.当时有英特尔,AMD和一些像Cyrix制造x86处理器的小型供应商.每个模型都有自己的性能特征与DIV指令相比.我的汇编时序功能只会返回在紧密循环中完成的某些固定数量的DIV指令所采用的多个时钟周期.
所以我所做的是从运行我想要的每个处理器模型的实际PC中收集一些时间(来自该功能的原始返回值),并根据已知的处理器速度和处理器类型将它们记录在电子表格中.我实际上有一个命令行工具,它只是我的计时功能的一个薄壳,我会把一个磁盘带入计算机商店,并从显示模型中获取时间!(当时我在一家非常小的公司工作).
使用这些原始时序,我可以绘制一个理论图表,说明我应该为该特定CPU的任何已知速度获得什么时序.
这就是诀窍:我总是讨厌你运行一个实用程序,它会宣布你的CPU是99.8 Mhz或其他什么.显然它是100 Mhz,测量中只有一个小的舍入误差.在我的电子表格中,我记录了每个处理器供应商销售的实际速度.然后我将使用实际时间图来估计任何已知速度的预计时间.但是我会沿着这条线建立一个点表,其中时间应该转到下一个速度.
换句话说,如果所有重复划分的100个滴答意味着500 Mhz,200个滴答意味着250 Mhz,那么我会建立一个表,表示150以下的任何东西都是500 Mhz,而高于此值的任何东西都是250 Mhz.(假设这些是该芯片供应商提供的唯一两种速度).这很好,因为即使PC上的一些奇怪的软件丢失了我的时间,最终的结果往往仍然存在.
当然,现在,在超频,电源管理的动态时钟速度以及其他类似技巧的这些日子里,这样的方案将不太实用.在运行计时功能之前,至少需要做一些事情以确保CPU处于最高动态选择速度.
好的,我现在回去把我的草坪赶出去.