Cortex-A8 强制内存缓存
Cortex-A8 Forcing memory caching
有必要使用函数实时处理大量数字(~1 Mb),例如 void processData(char* data)
.
在目标平台上运行了以下测试:
int j = 10;
while(j--)
processData(dataPtr);
每次都使用相同的数据。它显示了以下结果:
- 第一次运行需要 ~22.5ms
- 第二次运行和其他需要 ~12,5ms
在我看来,这可能是由于第二次运行数据已经在处理器缓存中,因此它的工作速度要快得多。
问题是:在实际情况下,数据每次都会有所不同。
有没有办法将数据"预加载"到缓存中?
预取是可能的(使用 gcc
,请使用 __builtin_prefetch
),但应谨慎使用,否则可能会降低性能而不是提高性能。
在执行此操作之前,应检查函数中的内存访问模式,并尽可能进行优化。
基本上,我们希望尽可能少的内存访问,并且它们应该尽可能多地串行。
有一个预取操作,但不建议对整个数据集执行此操作。
更好的设计是在循环的每次迭代中,为下一次迭代(或者如果循环运行得非常快,则可能是之后的迭代)预取数据。
你可以做的是记住你的整个工作集适合LLC,你把第一次运行称为"热身运行",你没有考虑到它的时间。当然,如果第三次、第四次和进一步的运行时间与第二次运行显示的时间一致,则这种方法是合理的。然后,当您报告基准测试结果时,您显示平均 2 个第 N 个运行时间,但您在报告中提到数据符合 L3,并且对于更多"真实世界数据",预期会有不同的结果。我认为这通常被称为微基准测试,当你在同一个明确定义的常量数据集上测试一个特定函数的性能时。
相关文章:
- 有没有办法检查内存缓存是否已重新启动?
- g++ 如何对齐内存以确保对齐从缓存行的开头开始?
- 多线程C :从内存中读取力,绕过缓存
- 设备驱动程序内存缓冲区处理器缓存问题
- 为什么内存访问时间远远超过CPU缓存大小时会增加
- 是通过计算能力1.x的设备中的缓存的全局内存负载/商店
- 在紧密的物理和碰撞循环中进行缓存友好的内存访问
- 在处理内存中的一些长向量时如何不弄乱缓存?
- 如何在 Linux 下C++获取缓冲/缓存内存大小
- C++内存缓存库
- C++内存缓存类
- CPU 缓存是否也从以前的内存位置加载信息
- Cortex-A8 强制内存缓存
- 我可以检查内存块(例如,使用 malloc 分配)是否保留在缓存中吗?
- volatile限定符是否取消此内存的缓存
- 如何从C++将某些内存范围标记为不可缓存
- C++:缓存JSON而不是对象可以减少内存消耗吗
- 使用linux用户空间内存进行缓存
- 内联函数是如何增加内存缓存未命中的,以及与替代函数相比,它为什么不好
- 计算存储缓存元数据所需的缓存内存