cpu 时钟周期

在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。频率在数学表达式中用“f”表示,其相应的单位有:Hz(赫)、kHz(千赫)、MHz(兆赫)、GHz(吉赫)。其中1GHz=1000MHz,1MHz=1000kHz,1kHz=1000Hz。计算脉冲信号周期的时间单位及相应的换算关系是:s(秒)、ms(毫秒)、μs(微秒)、ns(纳秒),其中:1s=1000ms,1 ms=1000μs,1μs=1000ns。
  CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。通常所说的某某CPU是多少兆赫的,而这个多少兆赫就是“CPU的主频”。很多人认为CPU的主频就是其运行速度,其实不然。CPU的主频表示在CPU内数字脉冲信号震荡的速度,与CPU实际的运算能力并没有直接关系。主频和实际的运算速度存在一定的关系,但目前还没有一个确定的公式能够定量两者的数值关系,因为CPU的运算速度还要看CPU的流水线的各方面的性能指标(缓存、指令集,CPU的位数等等)。由于主频并不直接代表运算速度,所以在一定情况下,很可能会出现主频较高的CPU实际运算速度较低的现象。比如AMD公司的AthlonXP系列CPU大多都能已较低的主频,达到英特尔公司的Pentium 4系列CPU较高主频的CPU性能,所以AthlonXP系列CPU才以PR值的方式来命名。因此主频仅是CPU性能表现的一个方面,而不代表CPU的整体性能。
  CPU的主频不代表CPU的速度,但提高主频对于提高CPU运算速度却是至关重要的。举个例子来说,假设某个CPU在一个时钟周期内执行一条运算指令,那么当CPU运行在100MHz主频时,将比它运行在50MHz主频时速度快一倍。因为100MHz的时钟周期比50MHz的时钟周期占用时间减少了一半,也就是工作在100MHz主频的CPU执行一条运算指令所需时间仅为10ns比工作在50MHz主频时的20ns缩短了一半,自然运算速度也就快了一倍。只不过电脑的整体运行速度不仅取决于CPU运算速度,还与其它各分系统的运行情况有关,只有在提高主频的同时,各分系统运行速度和各分系统之间的数据传输速度都能得到提高后,电脑整体的运行速度才能真正得到提高。
  提高CPU工作主频主要受到生产工艺的限制。由于CPU是在半导体硅片上制造的,在硅片上的元件之间需要导线进行联接,由于在高频状态下要求导线越细越短越好,这样才能减小导线分布电容等杂散干扰以保证CPU运算正确。因此制造工艺的限制,是CPU主频发展的最大障碍之一。
  
  个人理解的是:
  一个微指令周期通常设计成一个CPU时钟周,而一条指令通常需要几条微指令,也就是一条指令占多少个字节就需要多少个时钟周期.
  
  参数:
代码:

#include <stdio.h>
#include <stdlib.h>

#ifndef rdtsc
//#define rdtscfreq 2.1280493e9
#define rdtscfreq 1
#define rdtsc(low,high) \
__asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high))

static inline  double rdtscdiff(unsigned int low1,unsigned int high1,unsigned int low2,unsigned int high2)
{
 const  double MAXintplus1 = 4294967296.0;
 unsigned int low,high;
 if (low2<low1) {
 low = 0xffffffff - low1 + low2;
 high = high2 - high1 -1;
 }
 else {
 high = high2 - high1;
 low = low2 - low1;
 }
// printf("%d,",low);
 return (double)high * MAXintplus1 + (double)low ;
}
static inline double mdtime(int id)
{
 static unsigned int high0,low0,high1,low1;
 if(id){
  rdtsc(low1,high1);
  return rdtscdiff(low0,high0,low1,high1)/rdtscfreq; 
 }
 else{
  rdtsc(low0,high0);
  return 0.0;
 }
}

#endif


int main() {
        unsigned int i, j;
        unsigned long long l1, l2;
  double t3;

        rdtsc(i, j);
        printf("%u, %u\n", i, j);
        l1 = i;
        l1 = l1<<32 + j;
        printf("%u\n", l1);

        sleep(1);

        rdtsc(i, j);
        printf("%u, %u\n", i, j);
        l2 = i;
        l2 = l2<<32 + j;
        printf("%u\n", l2);

        printf("%u\n", l2-l1);
        printf("=====================\n");
  mdtime(0);
  sleep(1);
  t3= mdtime(1);
  printf("cycle:%15f \n", t3);
  
        return 0;
}

结果:
[abiao@renjingbiao test]$  ./cpuCyle
2862787528, 319177
0
1506265676, 319178
0
0
=====================
lstrsse   time:2938969659.000000
[abiao@renjingbiao test]$  ./cpuCyle
3396861368, 319190
0
2039303239, 319191
0
0
=====================
cycle:2936048818.000000
[abiao@renjingbiao test]$  ./cpuCyle
1225801071, 319198
0
4160713964, 319198
0
0
=====================
cycle:2936045540.000000
[abiao@renjingbiao test]$
[abiao@renjingbiao test]$  ./cpuCyle
2173435180, 319296
0
813391392, 319297
0
0
=====================
cycle:2938978526.000000
[abiao@renjingbiao test]$
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值