【问题标题】:Strange small variation of memory bandwidth (but not CPU perf) on frequency-locked Cortex A15 device频率锁定的 Cortex A15 设备上的内存带宽(但不是 CPU 性能)奇怪的小变化
【发布时间】:2018-07-11 21:12:11
【问题描述】:

我需要一个性能稳定的 ARM 平台来进行精确的基准测试。目前我正在使用 Exynos 5422 Cortex A15/A7 设备。

通过禁用 Linux 内核中的各种频率缩放功能、为我的任务使用单独的 CPU 内核并将 IRQ 和内核工作队列移出,我的短期(10 秒范围内)性能变化不到 0.1%那个核心。

不幸的是,在几分钟的随机间隔内,内存带宽似乎减少了约 2%,就好像它有两种状态并在这两种状态之间切换。我能够得到小于 0.1% 的短期变化,所以这不是由测量误差引起的。由于减少量很小,因此不太可能是由内存频率变化或类似情况引起的。高精度测量表明,带宽减少非常均匀,并且不是由某些活动尖峰频率增加引起的。例如,我可以看到其他内核上的各种中断引起的带宽变化,原因是别的。温度变化对此也没有影响。

有没有人知道什么会导致这种随机的长期内存带宽减少?

【问题讨论】:

  • DMA 是否会争夺内存带宽?为了清楚起见,你是说你已经排除了从你的代码运行的核心窃取 CPU 周期的可能性,所以它只是内存带宽? (例如,通过将您的微基准更改为仅使用 ALU 指令,除了代码获取之外没有内存访问)。您是否有性能计数器来判断您是否遇到了 TLB 未命中(例如,由于某种原因而失效),或者缓存未命中是否增加(这可能表明预取出现了问题)?
  • 是的,我已经排除了 CPU 本身的所有问题。 TLB 未命中是相同的。当基准测试速度较慢时,L2 未命中/总请求的比率较高 - 如果可用带宽减少并且预取完成的页面较少,直到缓存未命中,这是预期的结果。

标签: linux performance memory benchmarking


【解决方案1】:

内存行为极其复杂(*)。一种方法是实际执行多次运行,获取他们的指标并应用您的统计知识来优化结果。您可能会尽可能稳定并仔细检查,问题是下一次运行,您很可能会因为未知原因得到不同的东西,如果您不检查,甚至看不到它。

它们是专门的基准测试工具,可以执行此操作并自动计算相关统计数据,并帮助您确定基准测试的准确性。 Java 中的一个例子是 JMH。当然,在您的环境中这会有所不同,除非您可以通过网络触发您的计算。

找到带宽问题的原因会很有意义,我希望你能找到它。但对我来说,能够忍受这样的问题并充分利用它是有好处的。

(*) 你需要的内存可以在 L1、L2 或 L3 缓存中。或者您可能必须从内存中获取它。根据内存设计和之前请求的内容,对该数据的访问可能再次有很大差异。

硬件本身将内存用于显示器和其他各种设备。内存本身只能将信息保持很短的时间,因此内存控制器将刷新内存的内容,影响其带宽和反应性。 (这也说明了掉电情况下丢失了什么内容:没有及时刷新)。系统本身可能决定跨程序重新分配内存,对其进行碎片整理,用于某些后台任务...

【讨论】:

  • OP 正在编写一个专门的内存基准测试工具,该工具的准确度可能比使用 Java 等托管语言所能达到的要高。不过,DRAM 刷新是一个不错的建议。
  • 我同意 java 确实不是最好的一致性,因为所有中间层。但它只是增加了现有问题。我确实发现 JMH 的统计方法很有趣,因为您在运行基准测试时实际测量了差异,然后可以发布带有置信度因子的分数。如果您只进行一次测量,或者不使用该信息,您将永远不会知道是否存在波动。它最终可以在 OP 机器上运行,并在下一台机器上失败,没有人会知道。
  • 我不建议使用 JVM 或 java 作为基准,我只是建议对基准的结果进行统计分析...
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 2012-10-09
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多