memory prefetch浅析
作者在用VTune分析程序性能时,发现大数组的非连续访问成为了CPU热点。经过排查,主要原因是这类访问模式对CPU缓存(Cache)很不友好,导致了大量的缓存未命中,从而拖累了性能。 为了优化这个问题,作者引入了x86架构提供的`prefetch`系列指令。其核心思想是,在程序真正用到数据之前,提前将指定地址的内存数据预取到各级缓存中,从而“掩盖”掉后续访问时的内存延迟。 文中提供了一段详细的测试代码,通过控制内存访问模式(顺序或跳跃)和计算复杂度,量化对比了预取指令的效果。测试数据显示,在跳跃访问内存导致性能严重下降的情况下(例如从22秒涨到66秒),加入恰当的预取操作后,执行时间基本恢复到了顺序访问时的水平(约28秒)。这直观地证明了预取指令在特定场景下能有效隐藏内存访问开销。 文章最终总结出prefetch的适用边界:当程序同时存在可观的内存访问延迟和一定的计算开销时,预取能有效提升性能。但如果计算本身很轻量,或者数据本身已在缓存中(如顺序访问),单纯依靠预取来加速读内存的意义则不大。