IM体育官网

条码打印机
当前位置 : 首 页 >> IM体育官网 >> 行业资讯

测量CPU的利器 - TSC

2023-03-22 09:30:44

自Pentium开始x86 CPU均引入TSC了,可提供指令级执行时间度量的64位时间戳计数寄存器,随着CPU时钟自动增加。

CPU指令

rdtsc: Read Time-Stamp Counter
rdtscp: Read Time-Stamp Counter and Processor ID

调用:

Microsoft Visual C++:

unsigned __int64 __rdtsc();
unsigned __int64 __rdtscp( unsigned int * AUX );

Linux & gcc :

extern __inline unsigned long long
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
__rdtsc (void) {
  return __builtin_ia32_rdtsc ();
}
extern __inline unsigned long long
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
__rdtscp (unsigned int *__A)
{
  return __builtin_ia32_rdtscp (__A);
}

示例:

1: L1 cache及内存的延迟测量:

编码:
{
    ......
    /* flush cache line */
    _mm_clflush(&data[0]);

    /* measure cache miss latency */
    ts = rdtscp(&ui);
    m |= data[0];
    te = rdtscp(&ui);
    CALC_MIN(csci[0], ts, te);

    /* measure cache hit latency */
    ts = rdtscp(&ui);
    m &= data[0];
    te = rdtscp(&ui);
      /* flush cache line */
    _mm_clflush(&data[0]);

    /* measure cache miss latency */
    ts = rdtscp(&ui);
    m |= data[0];
    te = rdtscp(&ui);
    CALC_MIN(csci[0], ts, te);

    /* measure cache hit latency */
    ts = rdtscp(&ui);
    m &= data[0];
    te = rdtscp(&ui);
    CALC_MIN(csci[1], ts, te);
    CALC_MIN(csci[1], ts, te);
}
最后:rdtscp电脑指令身体时长:

话题:显示1个大概字节与15个字节的常用的时期是这样的,为哪种?

2: 常见整型运算及多条指令执行周期:

代码怎么用:
{
    ......
    /* measure mul latency */
    ts = rdtscp(&ui);
    m *= *((U32 *)&data[0]);
    te = rdtscp(&ui);
    CALC_MIN(csci[2], ts, te);

    /* measure div latnecy */
    ts = rdtscp(&ui);
    m /= *((U32 *)&data[0]);
    te = rdtscp(&ui);
    CALC_MIN(csci[3], ts, te);

    /* measure 2*mul latnecy */
    ts = rdtscp(&ui);
    m *= *((U32 *)&data[0]);
    m *= *((U32 *)&data[0]);
    te = rdtscp(&ui);
    CALC_MIN(csci2[0], ts, te);

    /* double div */
    ts = rdtscp(&ui);
    m /= *((U32 *)&data[0]);
    m /= *((U32 *)&data[0]);
    te = rdtscp(&ui);
    CALC_MIN(csci2[1], ts, te);

    /* mul + div */
    ts = rdtscp(&ui);
    m *= *((U32 *)&data[0]);
    m /= *((U32 *)&data[0]);
    te = rdtscp(&ui);
    CALC_MIN(csci2[2], ts, te);

    /* measure float mul latency */
    ts = rdtscp(&ui);
    f = f * m;
    te = rdtscp(&ui);
    CALC_MIN(csci[4], ts, te);

    /* measure float div latency */
    while (!m)
        m = rand();
    ts = rdtscp(&ui);
    f = f / m;
    te = rdtscp(&ui);
    CALC_MIN(csci[5], ts, te);
}
后果:

现象:m及n的除法运算的历时只比m的除法多一点,但却清晰底于m的2次除法,为啥子?

注意事项:

1.考虑一下到CPU乱序施行的故障 ,rdtsc想要相互配合cpuid或lfence指命表,以保证质量计上述刻留水线已排净,即rdtsc要在线测量的指命表已施行完。可是的CPU提供数据了rdtscp指命表,相同于cpuid + rdtsc,但cpuid指命表原本的施行过渡期有下跌,而rdtscp指命表的施行更紧定。然而rdtscp并非大多数的CPU都能够,动用前应该经由cpuid指命表检查是并非能够: 即CPUID.80000001H:EDX.RDTSCP[bit 27]是并非为1

2.多核系统:新的CPU支持了Invariant TSC特性,可以保证在默认情况下各核心看到的TSC是一致的,否则测量代码执行时不能调度至其它核心上。另外TSC是可以通过MSR来修改的,这种情况下也要注意:
Invariant TSC: Software can modify the value of the time-stamp counter (TSC) of a logical processor by using the WRMSR instruction to write to the IA32_TIME_STAMP_COUNTER MSR

3.CPU降频问题:第一代TSC的实现是Varient TSC,没有考虑到降频的问题,故在低功耗TSC计数会变慢,甚至停止;后来又有了Constant TSC,解决了降频的问题,但在DEEP-C状态下依然会发生停止计数的情况,所以又有了具新的Invariant TSC的特性:
The time stamp counter in newer processors may support an enhancement, referred to as invariant TSC. Processor’s support for invariant TSC is indicated by CPUID.80000007H:EDX[8]. The invariant TSC will run at a constant rate in all ACPI P-, C-. and T-states. This is the architectural behavior moving forward. On processors with invariant TSC support, the OS may use the TSC for wall clock timer services (instead of ACPI or HPET timers). TSC reads are much more efficient and do not incur the overhead associated with a ring transition or access to a platform resource.

4.指令本身的时间开销
Pentinum Gold G5500T: 31 cycles Core i7-7820HQ: 25 cycles

5.权限问题(此指令可用于时序攻击,如Meltdown及Spectre):
CR4.TSD: Time Stamp Disable (bit 2 of CR4) — Restricts the execution of the RDTSC instruction to procedures running at privilege level 0 when set; allows RDTSC instruction to be executed at any privilege level when clear. This bit also applies to the RDTSCP instruction if supported (if CPUID.80000001H:EDX[27] = 1).

6.运算器冒泡机会:核算器本就是64位的,是是主频4G的CPU,必须100二十多年才会冒泡,这对我国的量测讲能够不使用注重7.时序測量易于被不干扰(线程调度员、占据、整体终断、虚假化等),耍求測量的汇编指令回文序列时应短,从而都要开始多少次測量


Copyright © IM体育官网 All rights reserved 备案号: 营业执照 主要从事于条码扫描枪,条码打印机,数据采集器 , 欢迎来电咨询! 服务项目可以:
IM体育官网-IM体育·(中国)官方网站-IM体育官网 IM体育中国)官方入口-IM体育登录平台-IM体育官网 im体育-im体育平台官网-IM体育官网 im体育官网-IM体育登录-IM体育官网