Arm 周期不一致且不反映CPU频率的性能计数

Arm 周期不一致且不反映CPU频率的性能计数,arm,embedded-linux,performancecounter,Arm,Embedded Linux,Performancecounter,简介: 我编写了一个Linux内核模块,用于在带有cortex a-15和a-7处理器(Odroid XU3)的ARM v7平台上进行性能计数器监控。我在研究中尝试使用的一个计数器是循环计数,它来自ARM技术参考手册,有自己的专用计数器。我已经将我的代码与其他实现和在线找到的ARM参考进行了核对;以下是启用CPU计数器的部件的一个片段: 使用的资源: 问题: 当我以固定的CPU频率(core 0为1.4GHz)打印在固定采样周期(100ms)内经过的周期时,我看到模块返回的值存在巨大

简介: 我编写了一个Linux内核模块,用于在带有cortex a-15和a-7处理器(Odroid XU3)的ARM v7平台上进行性能计数器监控。我在研究中尝试使用的一个计数器是循环计数,它来自ARM技术参考手册,有自己的专用计数器。我已经将我的代码与其他实现和在线找到的ARM参考进行了核对;以下是启用CPU计数器的部件的一个片段:

使用的资源:

问题: 当我以固定的CPU频率(core 0为1.4GHz)打印在固定采样周期(100ms)内经过的周期时,我看到模块返回的值存在巨大差异。请参见下面的图表以获取此示例。不仅方差看起来很高,而且测量的周期数并没有反映出给定采样时间和固定频率下我期望记录的周期数(对于给定场景,我期望每个样本上有1.4e8个周期)。是什么导致了与预期周期数的偏差


经过进一步思考并与同事讨论后,我认为测量周期和预期周期之间的差异在于cpuidle:它是Linux内核中的一个子系统,当内核不做任何事情时,会将CPU内核置于低功耗状态。某些最低状态会关闭时钟,这可能会导致循环计数器停止递增。这篇文章很好地描述了cpuidle及其工作原理:

cpu频率只是等式的一部分,它应该有一些因素,但肯定没有理由期望任何线性。处理器花费相当长的时间等待指令或数据。测量的时间中有多少与cpu频率有关,以及有多少系统是您将了解到的您也在运行一个操作系统,因此不需要一致且可重复的时间。@旧计时器即使cpu正在等待数据,只要时钟处于活动状态,周期是否仍应计数(因此CPU未处于低功耗睡眠状态)?是的,墙上的时钟时间与墙上的时钟时间应精确到每次测量一个刻度…但指令周期与墙上的时钟时间应随dram上运行的支持操作系统的处理器而变化,等等。。。