繁体   English   中英

如何确定时间戳计数器(TSC)重置了多少次

[英]How to determine how many times Time Stamp Counter (TSC) is reset

由于某些原因,我需要基于时标计数器(TSC)测量时间。 要阅读TSC,我正在使用以下代码:

#include <stdio.h>
#include <inttypes.h>

inline volatile uint32_t RDTSC32() {
    register uint32_t TSC asm("eax");
    asm volatile (".byte 15, 49" : : : "eax", "edx");
    return TSC;
}

inline volatile uint64_t RDTSC64() {
    register uint64_t TSC asm("rax");
    asm volatile (".byte 15, 49" : : : "rax", "rdx");
    return TSC;
} 

int main() {
    while (1) {
        printf("%" PRIu64 "\n", RDTSC64());
    }
} 

经过测试后,它可以正常工作。 除了一件事。 当它达到最大计数器值(在我的环境中,某些值大于4,256,448,731)时,计数器值将重置为0并继续运行。

在这种情况下,是否有任何方法可以查看已重置TSC多少次?

例如,下面的代码不能显示正确的时差:

#include <stdio.h>

int main() {
    long long start, end;
    start = RDTSC64();
    // long long works to do
    end = RDTSC64();
    printf("%lld \n", end - start);
} 

时间戳记计数器始终为64位,请参见Wipedia页面上的以下语句:

自奔腾以来,时间戳计数器(TSC)是所有x86处理器上存在的64位寄存器。

由于某种原因,您得到的截断值只有32位,这就是为什么它会自动换行。 要封装64位值,需要在4 GHz上进行146年的连续计数。

您的代码似乎想要像预期的那样同时使用eaxedx来保持两个32位的一半。 将值移到单个C变量时,一定会出错。 我相信您使用的代码段是针对GCC的; 也许那不再是您的编译器了?

检查生成的程序集,然后检查编译器文档中适当的内在函数。 这个问题对于特定于编译器的程序集有很好的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM