Cortex-A8 强制内存缓存

3

需要使用一个函数来实时处理一个大型数组 (~1 Mb) ,例如 void processData(char* data)

在目标平台上运行了以下测试:

int j = 10;
while(j--)
    processData(dataPtr);

每次使用相同的数据。它显示了以下结果:

  1. 第一次运行大约需要22.5毫秒
  2. 第二次及以后运行大约需要12.5毫秒

我认为这可能是因为在第二次运行时,数据已经在处理器缓存中,因此速度更快。

问题是:在实际情况下,数据每次都会不同。

是否有任何方法可以对数据进行“预加载”到缓存中?


1
当您访问以前未缓存的数据时,必须至少支付一次内存带宽/延迟的费用,因此通常情况下,通过预取指令或通过加载指令加载数据并没有总体差异。 - Paul R
我认为手动预加载内容不是一个好主意,除非你有充足的CPU周期,除非突然间你需要运行你以前可用的数据并立即获得结果...如果你在处理另一个数据集的同时预加载一个数据集,请注意不要强制将当前迭代的数据从缓存中清除以加速下一个迭代,依此类推。 - Mahmoud Al-Qudsi
2个回答

3

预取技术是可能的(使用gcc,可以使用__builtin_prefetch),但应该谨慎使用,否则可能会降低性能而不是提高性能。

在这之前,应该检查并优化函数中的内存访问模式。
基本上,我们希望尽可能少地访问内存,访问尽可能串行。

虽然有预取操作,但不建议对整个数据集进行预取。
更好的设计是,在循环的每次迭代中,预取下一次迭代的数据(或者如果循环非常快,则预取下下次迭代的数据)。


0
你可以这样做,牢记整个工作集适合LLC,在第一次运行时称之为“预热运行”,不将其计时考虑在内。当然,如果第三、四以及更多次运行的时间与第二次运行相同,则这种方法是合理的。然后,当你报告基准测试结果时,你展示2-N次运行时间的平均值,但你在报告中指出数据适合L3,并且更多“现实世界”的数据会有不同的结果。我认为这通常被称为微基准测试,当你在测试同一明确定义的常量数据集上的一个特定函数的性能时。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接