Cortex-A8 强制内存缓存

Cortex-A8 Forcing memory caching

本文关键字:缓存 内存 Cortex-A8      更新时间:2023-10-16

有必要使用函数实时处理大量数字(~1 Mb),例如 void processData(char* data) .

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

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

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

  1. 第一次运行需要 ~22.5ms
  2. 第二次运行和其他需要 ~12,5ms

在我看来,这可能是由于第二次运行数据已经在处理器缓存中,因此它的工作速度要快得多。

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

有没有办法将数据"预加载"到缓存中?

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

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

有一个预取操作,但不建议对整个数据集执行此操作。
更好的设计是在循环的每次迭代中,为下一次迭代(或者如果循环运行得非常快,则可能是之后的迭代)预取数据。

你可以做的是记住你的整个工作集适合LLC,你把第一次运行称为"热身运行",你没有考虑到它的时间。当然,如果第三次、第四次和进一步的运行时间与第二次运行显示的时间一致,则这种方法是合理的。然后,当您报告基准测试结果时,您显示平均 2 个第 N 个运行时间,但您在报告中提到数据符合 L3,并且对于更多"真实世界数据",预期会有不同的结果。我认为这通常被称为微基准测试,当你在同一个明确定义的常量数据集上测试一个特定函数的性能时。