gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:33:45 25 4
gpt4 key购买 nike

出于某些原因,我需要根据时间戳计数器 (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 位的,请参阅此声明 on the Wipedia page :

The Time Stamp Counter (TSC) is a 64-bit register present on all x86 processors since the Pentium.

出于某种原因,您得到一个只有 32 位的截断值,这就是它换行的原因。 64 位值需要在 4 GHz 下连续计数 146 年才能回绕。

您的代码似乎想同时使用 eaxedx 来保存两个 32 位的一半,正如预期的那样。将值移动到单个 C 变量时一定是出了什么问题。我相信您使用的片段是针对 GCC 的;也许那不再是您的编译器?

检查生成的程序集,并改为检查编译器文档以获得正确的内部函数。 This question有一些很好的答案,带有特定于编译器的程序集。

关于c - 如何确定时间戳计数器 (TSC) 重置了多少次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27164284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com