微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用于基准和时间戳计数器频率的rdtsc的准确度

作为基准testing任务的一部分,我正在研究可用于测量stream逝时间的不同机制。 我已经完成了使用clock_gettime ,但是我也用RDTSC指令做了足够的研究和testing。 我有几个关于相同的问题(基于我在几个在线主题上阅读的内容):

在较新的处理器(> Pentium 4)上,TSC以系统cpu上的最大频率打蜱。 它是否正确? 在这种情况下,使用嘀嗒数和频率来确定时间有效吗?

如果以上情况属实,则意味着TSC不受因节电等特性而导致的cpu频率变化的影响。 知道这一点,是否意味着通过使用RDTSC获得的总滴答不是采样代码使用的实际滴答 – 因为代码将运行在cpu的频率而不是TSC的频率? 另外,这是否意味着通过使用TSC ticks和cpu频率获得的时间不是代码片使用的实际时间?

我发现了很多关于跨内核同步TSC值的不同陈述(请参阅此主题 )。 我不知道什么是正确的,我猜也取决于处理器模型。 但是可以假设在新cpu上的内核之间是同步的吗? (这是不使用sched_set_affinity )?

将Linux系统时钟同步到Windows NTP服务

__time32_t时间精度?

测量C ++中的时间

在C ++中以微秒的分辨率测量时间?

/ usr / bin / time:没有这样的文件或目录

请注意,由于与之相关的各种问题(可移植性,可靠性等),我没有使用RDTSC 。 这些问题只是为了提高我对TSC工作原理和基准的理解。

如何在Mac OS X下redirect时间命令输出

如何在给定的时间间隔运行Unix命令?

不间断地执行Cpp Linux代码

如何减去两个time_t值(difftime返回double而不是time_t)?

我怎么能告诉我的机器上的每个核心使用相同的计时器?

根据英特尔的说法,不变的TSC意味着,

不变的TSC将在所有ACPI P-,C-中以恒定速率运行。 和T状态。

但是,这是什么速度? 好,

该速率可以由处理器的最大核心时钟与总线时钟比率来设置,或者可以由处理器启动时的最大解析频率来设置。 最大解析频率可能与处理器的最大限定频率不同,详见第18.14.5节。 在某些处理器上,TSC频率可能与品牌字符串中的频率不同。

在我看来,他们希望它是从品牌字符串的频率,但然后以某种方式并不总是得到正确的..虽然是什么频率?

TSC,IA32_MPERF和IA32_FIXED_CTR2工作在相同的最高分辨率的平台频率,这相当于可扩展总线频率和最大解析总线比的乘积。

对于基于英特尔酷睿微体系结构的处理器,可扩展总线频率在(0CDH)的位字段MSR_FSB_FREQ [2:0]中编码,请参见附录B“型号专用寄存器(MSR)”。 最大解析总线比率可以从以下位域中读取:

如果禁止XE操作,则可以在MSR_PLATFORM_ID [12:8]中读取最大解析总线比率。 它对应于最大合格频率。

如果启用XE操作,则最大解析总线比率在MSR_PERF_STAT [44:40]中给出,它对应于BIOS配置的最大XE操作频率。

这可能不是很有帮助。 TL; DR,以编程方式找到TSC费率太费劲了。 你当然可以很容易地在自己的系统上找到它,只是根据定时循环得到一个不准确的猜测,并采取“最有意义的数字”。 这可能是来自品牌字符串的数字。 它已经在我测试过的所有系统上,但是我没有测试过那么多。 如果不是,那么会有一些显着的差异,所以你一定会知道的。

另外,这是否意味着通过使用TSC ticks和cpu频率获得的时间不是代码片使用的实际时间?

是的,但不是所有的希望都失去了,通过使用TSC ticks和TSC rate (如果你以某种方式知道的话)所获得的时间将会给出实际的时间。 这里通常有很多关于不可靠性的FUD喷出。 是的,RDTSC不是序列化(但你可以添加序列化指令)。 RDTSCP是序列化的,但在某些方面还不够完善(不能太早执行,但执行得太晚)。 但是不是你不能使用它们,你可以接受一个错误,或者阅读下面链接的论文。

但是可以假设在新cpu上的内核之间是同步的吗?

是的,不,也许 – 它将被同步,除非TSC被写入。 谁知道,有人可能会这样做。 超出你的控制。 它也不会跨不同的套接字同步。

最后,在基准测试的背景下,我并没有真正购买RDTSC(P)的FUD。 您可以根据需要序列化它,TSC是不变的,您知道速率,因为它是您的系统。 也没有其他的选择,它基本上是高分辨率时间测量的来源,最终所有的事情最终都会用到。 即使没有特别的预防措施(但是对数据进行过滤),大多数基准测试的准确度和精确度都不错,如果您需要更多,请阅读如何在英特尔®IA-32和IA-64指令集架构上测试代码执行时间 ,编写一个内核模块,以便可以摆脱其他两个受FUD,抢占和中断影响的基准测试错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐