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



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

使用的资源:

  • 如何在 ARM Cortex-A8 处理器中测量程序执行时间?
  • http://neocontra.blogspot.se/2013/05/user-mode-performance-counters-for.html
  • https://pietrotech.wordpress.com/2016/09/28/sample-performance-counters-on-little-and-big-cluster-on-odroid-xu3-processor-exynos-5422/
  • ARM 参考手册(第 11 章,PMU(

问题:当我打印固定 CPU 频率(内核 0 为 1.4GHz(的固定采样周期 (100ms( 内经过的周期时,我看到模块返回的值存在大量差异。有关这方面的示例,请参见下表。不仅方差看起来非常高,而且测量的周期数并不反映我在给定采样时间和固定频率的情况下期望看到的周期数(对于给定的场景,我预计每个样本有 1.4e8 个周期(。是什么原因导致与预期的周期数出现这种差异?

在所有内核和仅跨内核 0 运行的内核模块的测量周期的可变性。

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

最新更新