预取数据以缓存x86-64

pyt*_*nic 15 c linux caching x86-64 prefetch

在我的应用程序中,我需要在一个大的连续内存数据块(100个MB)上执行计算.我想的是继续预取我的程序将来会触及的块的部分,这样当我对该部分执行计算时,数据已经在缓存中.

有人能给我一个简单的例子来说明如何用gcc实现这个目标吗?我在_mm_prefetch某处读过,但不知道如何正确使用它.另请注意,我有一个多核系统,但每个核心将并行处理不同的内存区域.

Jen*_*edt 17

gcc使用内置函数作为低级指令的接口.特别是对你的情况__builtin_prefetch.但是,在访问模式不易自动预测的情况下,使用它时,您应该看到一个可衡量的差异.


Pau*_*l R 15

现代CPU具有相当好的自动预取功能,如果您尝试启动软件预取,您可能会发现弊大于利.如果您发现实际上存在性能问题,那么很可能会有更多"低挂果",您可以专注于优化.当您急需几个百分点的吞吐量时,预取往往是您可能尝试的最后一件事.

  • +1我尝试过至少10次不同的预取.只有一次,我甚至设法获得了明显的加速.(我在评论中链接的那个.) (4认同)
  • 同意 - 即使是在较不复杂的自动预取的旧CPU上,从软件预取中获得任何好处总是很难 - 主要的问题是你通常需要提前几百个时钟周期启动预取,当然你需要有一些您可以利用的备用内存带宽,高性能代码通常不是这种情况. (4认同)