在只是汇总数据的循环中出现严重的时序抖动,为什么?只有imx8遭殃?

在只是汇总数据的循环中出现严重的时序抖动,为什么?只有imx8遭殃?

我用 C 创建了一个小应用程序

  • 分配 2 个 5 MB 的字符缓冲区
  • 循环1000次
  • 在循环中对 array1 或 array2 的所有元素求和(交替),因此在 5 Mio 加法的内部循环中。
  • 测量该内循环的时间(时钟单调)
  • 检查一个内部循环所需时间的最小/最大和平均值。

令我惊讶的是,在 IMX8 上,它的抖动系数几乎为 1.6 .. 2.0,因此在这 1000 个循环中,有一次大约为 4.5 毫秒,至少有近 9 毫秒。平均约为 4.6 毫秒,但这不仅仅是一两个循环需要更长的时间。

这与调度程序设置无关,因此甚至与调度程序 FIFO 无关。没有激活频率缩放。它不取决于核心数量。

缓冲区足够小,可以放入 RAM (512MB) 中,也足够大,不能放入 Level1/2 缓存。

我不清楚是什么原因导致这种抖动。在我使用 Zynq 处理器的旧系统中,这几乎没有抖动。

使用-O3 编译。使用 -O0 时不会出现抖动,但执行速度非常慢(循环需要 50 毫秒,而不是 5 毫秒)。

我试图用trace-cmd 弄清楚发生了什么,但我无法真正读取结果。我需要过滤,否则我会丢失很多事件。但要寻找什么?有什么想法吗?

还可以尝试隔离 1 个核心来执行此任务。结果具有可比性。所以我不相信调度程序,而是相信内存子系统的一些问题。

相关内容