linux指令cpu运行频率,linux – 使用RDTSC获取cpu周期 – 为什么RDTSC的值总是增加?...

只要您的线程保持在同一个CPU内核上,RDTSC指令将不断返回增加的数字,直到它包围.对于2GHz的CPU,这发生在292年之后,所以不是一个真正的问题.你可能不会看到它发生.如果您期望这么长时间,请确保您的计算机每50年重启一次.

RDTSC的问题是,您不能保证它在同一个时间点从老年多核CPU的所有核心开始,并且不保证它在同一时间点上在老年多CPU板上的所有CPU上启动.

现代系统通常没有这样的问题,但也可以通过设置一个线程的亲和力使其只在一个CPU上运行,从而在老系统上解决问题.这对于应用程序的性能来说不是很好,所以一般不应该这样做,但是对于测量蜱,这很好.

(另一个“问题”是许多人使用RDTSC来测量时间,这不是它所做的,但你写道,你想要CPU周期,所以这样很好,如果你使用RDTSC来衡量时间,你可能会有惊喜节电或超音波,或任何频繁变化的技术被称为踢.实际上,clock_gettime系统调用在Linux下令人惊讶.)

我只会在asm语句里面写入rdtsc,这对我来说很好,比一些晦涩的十六进制代码更可读.假设它是正确的十六进制代码(并且由于它不会崩溃并返回越来越多的数字,所以似乎是这样),你的代码是好的.

如果要测量一段代码所需的刻度数,则需要一个刻度差,只需减去不断增加的计数器的两个值.像uint64_t t0 = rdtsc(); … uint64_t t1 = rdtsc() – t0;

请注意,如果需要从周围的代码中隔离出非常精确的测量值,则需要在调用rdtsc之前(或使用只在较新的处理器上支持的rdtscp)来序列化,即停止流水线.可以在每个特权级别使用的一个序列化指令是cpuid.

在回应评论中的进一步问题时:

当您打开计算机时,TSC从零开始(并且BIOS会将所有CPU上的所有计数器重新设置为相同的值,尽管几年前的某些BIOS不能可靠地执行).

因此,从您的程序的角度来看,计数器开始“过去一些未知的时间”,并且随着CPU看到的每个时钟脉冲都会增加.因此,如果现在执行返回该计数器的指令,并且之后的任何时间在不同的进程中,它将返回一个更大的值(除非CPU被暂停或关闭).相同程序的不同运行得到更大的数字,因为计数器不断增长.总是.

现在,clock_gettime(CLOCK_PROCESS_CPUTIME_ID)是另一回事.这是操作系统给予该过程的CPU时间.当你的进程开始时,它从零开始.一个新的过程也从零开始.因此,彼此之间运行的两个进程将获得非常相似或相同的数字,而不是不断增长.

clock_gettime(CLOCK_MONOTONIC_RAW)更接近于RDTSC的工作原理(在一些较旧的系统上实现).它返回一个增加的值.如今,这通常是一个HPET.但是,这真的是时候了,而不是勾选.如果您的计算机进入低功率状态(例如以1/2正常频率运行),它仍将以相同的速度前进.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值