Arm Statistical Profiling Extension (SPE, 统计分析扩展) 是一种架构级功能,旨在增强 Arm CPU 的指令执行分析。自 2019 年 Arm Neoverse N1 CPU 平台问世以来,该功能便与 Arm CPU 中普遍配备的 Performance Monitor Unit (PMU, 性能监控单元) 并存。
为了能从 SPE 和 PMU 等功能中获益,一个重要的步骤就是提供工具、文档和示例以便形成一种自顶向下 (Top-Down) 的系统级芯片 (SoC) 性能分析解决方案。近期,Arm 的六名工程师发布了一份关于使用 SPE 进行性能分析的详细白皮书。
本文针对软件开发者、性能分析师和芯片工程师介绍了使用 SPE 进行性能分析和根源问题分析的概念和方法。
Arm SPE 是一种硬件辅助 CPU 分析机制,可提供详细的分析功能。它会记录关键执行数据,包括程序计数器、数据地址和 PMU 事件。SPE 可增强对分支、内存访问等的性能分析,从而助力软件优化的实现。SPE 数据可用于使用 Linux perf 等工具进行源代码热点检测、内存访问分析,以及数据共享分析的精确采样。
SPE 采样包括四个阶段:运算采样、记录关键执行信息、样本记录后筛选,以及将记录存储在内存中。它可以使用监控工具进行高效的分析和数据提取。SPE 使用减法计数器定期选择微运算进行分析。SPE 样本还会记录指令从 CPU 后端开始运算的执行周期。
使用 Linux perf 工具收集数据时,可启用 SPE 分析功能。Arm 还发布了 SPE-Parser 辅助工具,以支持 SPE 追踪的数据收集和分析。该工具可以将数据导出为 CSV 和 Parquet 格式,提高了分析的灵活性。
已发布的 SPE 白皮书中提供了四个案例,用来说明该功能的价值。
1
Apache Arrow CSV 写入器:性能优化
第一个案例是利用 SPE 功能来优化 Apache Arrow CSV 写入器代码。结果表明,在 Neoverse N1 平台上,性能提高了 40%。该案例研究包括检测单位周期指令数 (IPC) 和带宽 (GB/s),然后进一步检查 MPKI 和未命中率。其次,运算组合指标揭示了 CSV 写入器工作负载对整数指令和分支的高度依赖,这表明可能存在矢量化优化的机会。
通过对 L1D 缓存事件和分支预测错误进行分析,揭示了与 memcpy 函数相关的问题,其中该函数频繁出现缓存缺失和分支预测错误的情况。该案例研究还对 memcpy 中的分支进行了分析,结果认为分支预测错误的根源在于缓冲区大小预测偏差导致的效率不足。该案例研究强调了在 Arrow CSV 写入器中结合 memcpy 运算对于数据字段和分隔符的复杂性,导致 CPU 分支预测未达到最佳状态。
使用 SPE 进行分析后,便进入了真正有趣的部分,即优化 CSV 写入器代码。第一阶段是引入 copy_separator 辅助函数,以改进热循环中分隔符和行结束符的复制。对经优化的代码进行了基准测试。结果表明,吞吐量从 1.5~1.8 GB/s 提高到 2.1 GB/s,指令总数减少,IPC 从 2.22 提高到 2.58。与分支相关的指标大幅降低,促进了整体性能的提升。在 Neoverse 核心上优化代码时,我们建议使用 SPE 进行热点分析和根源检测。
2
利用 SPE 进行内存访问分析
基于 SPE 进行分析可以获取有关内存运算的宝贵信息,包括内存地址、执行延迟和数据源信息。该分析有助于确定与内存访问相关的瓶颈和性能问题,并且可以采集通常需要运行 LMBench 才能获取的部分数据。
SPE 可记录内存负载的分层数据源命中情况,其中数据源编码取决于系统的缓存层次,如 L1 数据缓存、L2 缓存、LLC 或 RAM。
使用 SPE 性能分析数据对内存访问进行分析需要筛选记录,以便着重针对特定代码部分,从中提取延迟值,并检查由内存运算触发的 PMU 事件。内存测试用例显示,SPE 衍生的延迟接近 LMBench 报告的延迟。SPE 数据还有助于分析性能问题,如 TLB 未命中。SPE 衍生的数据源信息与分层内存访问层级结构相匹配,这有助于确定内存访问在缓存层次结构中的命中位置。
3
内存带宽测试
SPE 分析还可用于预估内存带宽。不过需要注意的是,SPE 是一种基于采样运算的统计测量工具,对于内存带宽测量不一定百分百精确。SPE 可用于优化和精细研究时的比较分析,特别是对于具有可预测和熟知的内存访问模式的代码,如微内核。SPE 监测工具中推出的 SPE-Parser 工具可用于处理通过 Linux perf 工具收集的原始 SPE 分析数据。输出结果可提供有关分析结果的宝贵信息。内存读取带宽是通过经筛选的 SPE 样本以统计方式预估出来的。要计算这一估计值,需要将基准读取的总内存大小除以总执行时间。
4
数据共享分析
最后一个用例强调了 SPE 用于多线程工作负载中数据共享分析。数据共享问题可能会导致性能问题,特别是当多个线程在同一数据集上工作时,这会造成缓存一致性开销。缓存伪共享便是一个常见的性能问题。当一个处理器修改了缓存行上的数据项,而另一个处理器在该缓存行的不同部分工作时,就会出现这种情况。伪共享会导致缓存失效,并降低性能。
Linux perf c2c 工具会分析从 SPE 获取的内存访问数据,包括数据源信息、数据地址和指令 PC 地址。Perf c2c 可通过提供存在潜在问题的缓存行地址信息,为伪共享问题检测带来帮助。其中包括不同进程访问的缓存行中的数据偏移、指令地址、本地或远程(跨 CPU)访问信息,以及所涉及的 NUMA 节点。该工具会报告可能存在伪共享的缓存行的详细信息,以及不同线程访问的数据偏移,从而帮助开发者发现并解决伪共享问题。SPE 分析与 perf c2c 工具相结合,可用于识别和解决多线程应用中的伪共享问题,最终提高性能。
总结
Arm SPE 可提供详细的 CPU 分析功能,包括常规代码优化、内存访问分析、内存延迟预估和数据共享分析。
SPE 可用于对源代码热点检测、内存访问分析和数据共享问题进行精确采样。它可通过记录关键执行数据来增强性能分析,并且能够与 Linux perf 等工具集成,帮助用户有效地进行分析并优化代码。该工具集功能全面,能够让用户识别瓶颈,加深对 CPU 行为的理解,并提高软件性能。
审核编辑:刘清
全部0条评论
快来发表一下你的评论吧 !