当前位置:  开发笔记 > 开发工具 > 正文

装配CPU频率测量算法

如何解决《装配CPU频率测量算法》经验,为你挑选了2个好方法。

用于测量处理器频率的常用算法有哪些?



1> Nathan Fellm..:

Core Duo支持两个名为IA32_MPERF和IA32_APERF的特定于模型的寄存器后的Intel CPU.
MPERF以CPU支持的最大频率计数,而APERF以实际当前频率计数.

实际频率由下式给出:

freq = max_frequency*APERF/MPERF

您可以使用此流程阅读它们

; 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中运行.

我不知道操作系统是否提供了读取这些内容的接口,尽管它们主要用于电源管理,因此它可能不提供这样的接口.


我使用此站点将LaTeX代码转换为GIF:http://en.wikibooks.org/wiki/LaTeX/Mathematics.数学的LaTeX语法在这里描述:http://en.wikibooks.org/wiki/LaTeX/Mathematics.

2> Tim Farley..:

我将在这个答案中与各种细节约会,但是到底是什么......

几年前我不得不在基于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处于最高动态选择速度.

好的,我现在回去把我的草坪赶出去.


我会说99.8的速度可能是准确的,他们*瞄准*100Mhz但是错过了.你不要指望他们像你手表一样剔除有时会像时间一样的系统芯片.
推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有