Cortex-A8强制内存缓存

时间:2012-05-06 10:28:07

标签: c++ c caching cortex-a8

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

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

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

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

  1. 第一次运行需要~22.5ms
  2. 第二次运行,其他人需要~12.5ms
  3. 在我看来,这可能是因为在第二次运行时数据已经处于处理器缓存中,因此它运行得更快。

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

    有没有办法让一种“预加载”的数据缓存?

2 个答案:

答案 0 :(得分:3)

可以预取(使用gcc,使用__builtin_prefetch),但应谨慎使用,否则可能会降低性能而不是改进性能。

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

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

答案 1 :(得分:0)

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