Cortex-A8 强制内存缓存

Posted

技术标签:

【中文标题】Cortex-A8 强制内存缓存【英文标题】:Cortex-A8 Forcing memory caching 【发布时间】:2012-05-06 10:28:07 【问题描述】:

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

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

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

每次都使用相同的数据。结果如下:

    第一次运行大约需要 22.5 毫秒 第二次运行和其他运行大约需要 12.5 毫秒

在我看来,这可能是由于第二次运行时数据已经在处理器缓存中,因此它运行得更快。

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

有什么方法可以“预加载”数据以进行缓存?

【问题讨论】:

当您访问以前未缓存的数据时,您必须至少为内存带宽/延迟支付一次费用,因此一般而言,通过预取指令或通过加载指令加载它并没有总体上的区别。 我认为手动预加载内容不是一个好主意,除非您始终有空闲的 CPU 周期,除非您突然需要通过以下方式运行数据(以前可用)并立即获取结果...如果您在处理另一个数据集的同时预加载一个数据集,请注意不要最终将当前迭代的数据强制从缓存中取出以加快下一个迭代,依此类推等等。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于Cortex-A8 强制内存缓存的主要内容,如果未能解决你的问题,请参考以下文章

sh 强制删除页面缓存并触发Linux MM的内存页面压缩程序

关于tengine的内存/缓存机制(尚不明确)

缓存一致

linux下清理内存以及swap

C#强制清除缓存

C# volatile 变量:内存栅栏 VS。缓存