阻止或阻塞cpu数据缓存加载

Preventing or blocking cpu data cache loading

本文关键字:缓存 加载 数据 cpu      更新时间:2023-10-16

我的任务是评估各种风格的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的设计是为了充分利用数据和指令缓存。