用RDTSC指令进行性能测试

关于时间的思考:

  1. 时间维度与xyz空间维度不一样,时间只是人造的度量变化的工具(或者说坐标系)。
  2. 假设整个宇宙只有一个孤独的光子(单光子热寂),没有任何参考系,
  3. 那么,宇宙熵持续不变,
  4. 光子并不知道自己存在空间位移的变化,
  5. 光子只知道自己震荡的次数,用光子的震荡次数就可以进行计时,度量时间。

秒的定义:当铯-133原子处于非扰动基态时两个超精细能级间跃迁对应的辐射频率ΔνCs以Hz(即等于s-1)为单位表达时选取固定数值9192631770倍来定义秒。

个人认为,需要注意的是,宇宙任何地方都没有绝对的秒存在,因为任何地方都在运动,运动本身就会改变铯-133原子的震荡速度,因为光速不变原理。

前段时间看到一个新闻,科学家测量出了有史以来最短的时间间隔,光子穿过氢分子的时间,274仄(音zè)秒。氢分子大约0.2nm。1仄秒为10^-21秒,比飞秒-15还小6个量级。普朗克时间是-43。这种精度的时间测量,可能会带来核聚变技术的加快发展,或许可以与光镊、激光加速等技术结合,精确控制原子高速碰撞。

回到cpu计时问题:
衡量算法的时间复杂性,往往用cpu震荡次数来度量,这与人类用铯-133原子的震荡次数度量时间没有区别。
现代cpu往往都是变频的,例如800-4400MHz之间变化。
intel等公司就推出了tsc(Time Stamp Counter)概念,lscpu可以在指令集中找到tsc相关的多个flag,具体不展开,问问chatgpt就行。
典型的intel cpu tsc模块是基于38.4MHz固定频率的晶振进行65倍频,获得精度约为0.4ns的tsc计时器。

关于tsc源码
这个可以查linux源码,核心的指令就是RDTSC指令。
intel官方推荐了一篇文章:https://www.ccsl.carleton.ca/~jamuir/rdtscpm1.pdf
我们从linux源码中裁剪获得查询tsc频率的源码:
通过cpuid获取失败就从cpuinfo文件获取型号字符串最后那个标识信息。

double get_tsc_freq(){
    static double tsc = 0;  // tsc计时指令的速度hz
    if (tsc > 0)
        return tsc;
    unsigned int op(0x15),op2(0),a,b,c,d;//a==2 b==130 c==38400000 d==0
    asm("mov %%rbx, %%rdi\n"
        "cpuid\n"
        "xchg %%rdi, %%rbx\n"
        : "=a"(a), "=D"(b), "=c"(c), "=d"(d)
        : "a"(op), "2"(op2));
    if (a > 0 && b > 0 && c > 0)
        tsc = (double)c * (double)b / (double)a;  // 2.496e+09 hz
    return tsc;
}

以及tsc值查询函数

u64 rdtsc(void){
    unsigned int low, high;
    asm volatile("rdtsc" : "=a" (low), "=d" (high));
    return low | ((u64)high) << 32;
}

你可能感兴趣的:(c,c)