Assembly CPU frequency measuring algorithm

后端 未结 10 2042
时光取名叫无心
时光取名叫无心 2020-12-01 14:29

What are the common algorithms being used to measure the processor frequency?

10条回答
  •  一个人的身影
    2020-12-01 15:07

    One way on x86 Intel CPU's since Pentium would be to use two samplings of the RDTSC instruction with a delay loop of known wall time, eg:

    #include 
    #include 
    #include 
    
    uint64_t rdtsc(void) {
        uint64_t result;
        __asm__ __volatile__ ("rdtsc" : "=A" (result));
        return result;
    }
    
    int main(void) {
        uint64_t ts0, ts1;    
        ts0 = rdtsc();
        sleep(1);
        ts1 = rdtsc();    
        printf("clock frequency = %llu\n", ts1 - ts0);
        return 0;
    }
    

    (on 32-bit platforms with GCC)

    RDTSC is available in ring 3 if the TSC flag in CR4 is set, which is common but not guaranteed. One shortcoming of this method is that it is vulnerable to frequency scaling changes affecting the result if they happen inside the delay. To mitigate that you could execute code that keeps the CPU busy and constantly poll the system time to see if your delay period has expired, to keep the CPU in the highest frequency state available.

提交回复
热议问题