阻止或阻塞cpu数据缓存加载
Preventing or blocking cpu data cache loading
我的任务是评估各种风格的ARM处理器(基准测试),特别是片上系统(SOC)。有些SOC有很多数据缓存,有些则很少。因此,我希望我的程序能够阻塞数据缓存。
我已经写了一个行走1测试访问内存以外的核心,但在SOC上。我将在我们现有的处理器上运行它,它只有很少的数据缓存,并在Cortex M3处理器上运行它,它有很多数据缓存内存。
我关注的是获取处理器外内存的持续时间。如果我将Walking 1的内存大小设置为大于数据缓存的大小,则运行测试的时间会及时"指数化"。例如,对于较小的内存,测试在几分钟内运行,对于较大的内存,测试需要几个小时。
问题:是否有一种习惯用法可以用来防止处理器将整个数组加载到处理器的数据缓存中?
(注意:这被标记为C和c++,因为我可以在语言之间进行选择。如果C没有习惯用语,但c++有,那么我会先试试c++。)
- 平台:各种嵌入式或片上系统(开发)
- 处理器:ARM Cortex系列,芯片上有不同的外设和不同的数据缓存大小。
- 编译器:IAR嵌入式工作台,GNU C, GNU c++(用于
除非你的编译器提供了访问内存区域保护寄存器的函数,否则你需要做一些汇编来将内存区域设置为不可缓存的:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0290g/Chdhdahb.html或如下所述,通过c1控制寄存器的第2位和第12位全局禁用一级数据和指令缓存,该寄存器通过协处理器寄存器15访问= CP 15:
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/Babebdcb.html http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0338g/Babgdhif.html这假设您的ARM处理器具有CP 15功能。可能还有其他对您的测试有用的控制寄存器。我不确定在没有CP 15功能的ARM处理器上如何做到这一点。
如果不能执行@rcglfr所说的,则可以按缓存行的大小遍历数据
为了避免修改你的MMU表,你可以禁用你的数据缓存(和你的二级缓存,如果你有一个)。
在arm926ejj - s上,这样做:
// Enable the data cache
FUNC_START_ARM(hal_dcache_enable,r1)
push {lr}
mov r0,#0
mcr p15,0,r0,c7,c6,0 /* invalidate d-cache */
mrc p15,0,r1,c1,c0,0
orr r1,r1,#0xC
/* enable DCache and write buffer */
mcr p15,0,r1,c1,c0,0
pop {lr}
bx lr
// Disable the data cache (and invalidate it, required semantics)
FUNC_START_ARM(hal_dcache_disable,r1)
push {lr}
1: mrc p15,0,r15,c7,c14,3
bne 1b
mrc p15,0,r1,c1,c0,0
bic r1,r1,#0xC
/* disable DCache AND write buffer */
mcr p15,0,r1,c1,c0,0
mov r1,#0
mcr p15,0,r1,c7,c6,0 /* clear data cache */
pop {lr}
bx lr
查看ARM架构参考手册,了解如何在ARM上禁用d-cache。
当你启用/禁用缓存时,一定要遵循ARM关于缓存无效的指导方针(这取决于你的ARM内核)
与同事讨论后,我们将保留数据和指令缓存。
评估是针对Cortex系列和我们的ARM7TDMI处理器之间的性能改进。很大一部分的改进是缓存。
总之,要禁用缓存,必须使用汇编语言。没有高级语言习惯来阻止CPU使用缓存。cpu的设计是为了充分利用数据和指令缓存。
- std::原子加载和存储都需要吗
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 为什么加载SDF会导致Mobilizer创建闭环错误
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- 如何使用tinyxml2从XML加载父实体和子实体
- 如何在C++中使用pybind11加载一个pickle python列表
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 空函数的参数是否加载到缓存中?
- QWebEngine 5.7.1 离线导航加载缓存
- 点燃缓存加载时间的选择查询
- 一次加载整个缓存行以避免争用其中的多个元素
- 测量 l1/l2 缓存中加载的用于读取(包括预取)的行数
- CPU 缓存是否也从以前的内存位置加载信息
- 阻止或阻塞cpu数据缓存加载
- 在进程启动时加载依赖缓存
- 如何在QWebEngine中加载缓存
- 有多少对象(包含 std::vectors)加载到 L1/L2/L3 缓存中