【问题标题】:Why ARM SMP Linux kernel forces cachepolicy to writealloc?为什么 ARM SMP Linux 内核强制缓存策略为 writealloc?
【发布时间】:2019-08-09 03:53:11
【问题描述】:

在 ARM SMP Linux 内核中使用 writealloc 缓存策略是否存在架构上的原因?我们可以将其更改为写回缓存策略吗?

内核启动日志:

[0.000000] 为 SMP 强制写入分配缓存策略
[0.000000]内存策略:数据缓存writealloc

【问题讨论】:

  • 你为什么要'回写'?你有一些硬件问题吗?有一些参数(CP15 配置)可以使大的连续写入绕过缓存。例如,一个大的memset()。这是您不希望写入分配的唯一工作负载;除非你有一些硬件错误......所以只是说你的愿望似乎被误导了,因为你没有解释你为什么要这样做。即,即使你可以,这似乎是个坏主意。
  • 使用 writealloc,memcpy 比写回缓存策略更慢。这可能使 UP 比 SMP 更快地执行内存操作。不过SMP应该更厉害了……这不是出乎意料吗?
  • memcpy 就像memset,这就是我提到的。请参阅:memcpy with write cache 来自 embedded.com。差异并不那么显着(10-15% 最坏的情况),然后你必须永远不要使用复制的目标。还有其他工作负载可以使写入分配受益。我相信如果您愿意,您仍然可以请求不可缓存的内存。你只是不能告诉内核使用它。

标签: linux-kernel arm


【解决方案1】:

在 ARM SMP Linux 内核中使用 writealloc 缓存策略是否存在架构上的原因?

首先,对于大多数工作负载来说,它的速度要快得多。其次,spin_locks 和其他 Linux 同步原语使用 LDREX 和 STREX,可能需要有一个写分配策略Xilinx W/A and exclusive,或者至少会使使用独占访问的代码复杂化,这对 SMP 来说是一个很大的好处系统。

写分配意味着回写缓存; no-write allocate 意味着一个直写缓存(或基本上没有写入缓存)。使用直写式缓存来获得排他锁可能要困难得多(因为您必须复制回写式缓存才能实现排他锁)。

我们可以将其更改为写回缓存策略吗?

看起来没有。至少在不修改源代码的情况下并非如此,这就是我认为您的意思。内核参数cachepolicy 可以是其中之一,

  • 未缓存
  • 缓冲
  • 直写
  • 回写
  • writealloc

build_mem_type_table 强制它为 SMP 系统“写入分配”。至少您需要更改此代码。但是,如果您天真地将其删除,则会产生后果。例如,请参阅ca8f0b0a545f55b


来源:Wikipedia

有两种基本的缓存写入方法:

  • Write-through:写入缓存和后备存储是同步完成的。
  • Write-back(也称为 write-behind):最初,只对缓存进行写入。对后备存储的写入被推迟,直到修改的内容即将被另一个缓存块替换。

...

由于写入操作没有数据返回给请求者,因此需要对写入未命中做出决定,是否将数据加载到缓存中。这是由以下两种方法定义的:

  • Write allocate(也称为 fetch on write):将丢失写入位置的数据加载到缓存中,然后执行写入命中操作。在这种方法中,写入未命中类似于读取未命中。
  • No-write allocate(也称为 write-no-allocate 或 write around):未写入位置的数据不会加载到缓存中,而是直接写入后备存储。在这种方法中,仅在读取未命中时将数据加载到缓存中。

...

  • 回写式缓存使用写入分配,希望后续写入(甚至读取)到现在已缓存的同一位置。
  • 直写式缓存使用无写入分配。在这里,后续写入没有优势,因为它们仍需要直接写入后备存储。

缓存以外的实体可能会更改后备存储中的数据,在这种情况下,缓存中的副本可能会过期或过时。或者,当客户端更新缓存中的数据时,其他缓存中的这些数据的副本将变得陈旧。缓存管理器之间保持数据一致的通信协议称为一致性协议。


ARM cpus 通常有一个写入缓冲区,因此多个写入(例如 32 位)将被组合成 128 位(AXI 总线大小),对于 SDRAM 设备甚至更大。

【讨论】:

  • ARM doc on local and global monitors 参考了 SMP 系统和窥探控制单元或 SCU,其中提供了有关您为什么需要缓存的一些详细信息。仅使用本地监视器时,LDREX/STREX 的效率会更高。多核通常只需要带有回写功能的本地监视器。如果有 GPU 或替代 DSP、实时 CPU,则需要全局监视器。如果支持全局监视器,则可以使用 LDREX/STREX 而无需回写。
猜你喜欢
  • 2012-10-27
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-14
相关资源
最近更新 更多