【问题标题】:Preventing or blocking cpu data cache loading防止或阻止 cpu 数据缓存加载
【发布时间】:2014-06-18 16:23:18
【问题描述】:

我的任务是评估各种 ARM 处理器(基准测试),特别是片上系统 (SOC)。一些 SOC 有很多数据缓存,而另一些则很少。因此,我希望我的程序阻止数据缓存。

我编写了一个walking 1 测试,它访问核心之外的内存,但在SOC 上。我将在我们目前的处理器上运行它,它只有很少的数据缓存,并在具有大量数据缓存的 Cortex M3 处理器上运行。

我专注于在处理器外部获取内存的持续时间。如果我将 Walking 1 的内存大小设置为大于数据缓存的大小,则运行测试会及时“取幂”。例如,对于较小的内存,测试在几分钟内运行,对于较大的内存,测试需要数小时。

问题:有没有一种习语可以用来防止处理器将整个数组加载到处理器的数据缓存中?
(注意:这被标记为 C 和C++,因为我可以在两种语言之间进行选择。如果 C 没有成语,但 C++ 有,那么我会先尝试 C++。)

  • 平台:各种嵌入式或片上系统(开发/ 评估板),无操作系统。
  • 处理器:ARM Cortex 系列,芯片上有不同的外设 以及不同的数据缓存大小。
  • 编译器:IAR Embedded Workbench、GNU C、GNU C++(用于 各种电路板供应商的背景)。

【问题讨论】:

  • 如果您关注内存带宽,那么What is the fastest way to copy memory on a Cortex-A8? 可能会有所帮助。事实上,选择性地禁用缓存可能是不公平的。一些内存(DDR SDRAM)非常擅长写入大量数据(例如 8*16 位)。如果您强制使用较小的大小,则可能会使内存传输效率低下。即,某些内存类型与缓存一起工作得更好,因此禁用它们可能是不公平的。我至少会在禁用缓存的情况下测试不同大小的读/写。
  • 您的“当前处理器”也是 M 级的,还是较旧的架构之一?请注意,M3 和朋友没有架构缓存,因此对外部缓存的任何控制都可能是特定于 SoC 的,并且通常与 A 类/传统架构有很大不同(例如,内存映射系统寄存器而不是 CP15)
  • 我认为你需要重新阅读 arm 文档,了解 arch 有什么,其次,如果你不想使用数据缓存,那么就不要打开它......还要了解每个的性质您正在使用的芯片与您正在与之交谈的公羊的几何形状和速度有关
  • @artlessnoise:我试图在我们目前的 ARM7TDMI 和一些 Cortex 版本之间建立一个公平的基准。我想通过升级向管理层展示性能优势。
  • @Notlikethat:我们目前的处理器是 NXP79525,一个包含 ARM7TDMI 的 SOC。我们正在处理数据样本并需要更多带宽,因此需要与所有 Cortex 进行比较。也许数据缓存应该作为基准测试的一部分启用,仍然不确定。

标签: c++ c arm benchmarking cpu-cache


【解决方案1】:

除非您的编译器提供访问内存区域保护寄存器的函数,否则您需要进行一些汇编以将内存区域设置为不可缓存:

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 处理器上完成。

【讨论】:

  • MPU 在 Cortex-M3 芯片上是可选的。其他 ARM CPU 可能具有 MMU,并且在两者上,裸机应用程序可能都不使用。但是,您是正确的,将部分/区域标记为不可缓存是一种方法。
【解决方案2】:

如果你不能按照@rcglfr 所说的那样,你可以通过缓存行的大小来遍历数据。

【讨论】:

    【解决方案3】:

    为避免修改您的 MMU 表,您可以只禁用数据缓存(如果您有 1,则禁用 L2 缓存)。

    在 ARM926EJ-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 内核)

    【讨论】:

      【解决方案4】:

      在与同事交谈后,我们将保留数据和指令缓存。

      评估是针对 Cortex 系列和我们的 ARM7TDMI 处理器之间的性能改进。很大一部分改进是缓存。

      总之,要禁用缓存,必须使用汇编语言。没有高级语言习语可以阻止 CPU 使用缓存。 CPU 旨在充分利用数据和指令缓存。

      【讨论】:

        猜你喜欢
        • 2018-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-17
        • 2013-02-12
        • 2012-06-13
        • 1970-01-01
        • 2019-03-19
        相关资源
        最近更新 更多