【问题标题】:Are there any such processors which have instructions to bypass the cache?是否有任何此类处理器具有绕过缓存的指令?
【发布时间】:2013-06-10 05:15:04
【问题描述】:

是否有任何此类处理器具有绕过特定数据缓存的指令? This question 也有一个答案表明 SSE4.2 指令确实绕过了缓存。有人能告诉我吗?

【问题讨论】:

  • 我很好奇:绕过缓存有什么实际应用?我想到的只是提高指令时序的可预测性。还有其他人吗?
  • 我经常遇到的两种情况是在不同内核上运行的线程之间共享时间敏感数据,以及写入内存映射寄存器以与其他硬件(如 UART IC)接口
  • @wallyk:典型的目的是防止缓存污染(例如,如果您正在写入大量数据并且不希望“很快”读取任何数据,并且不希望您需要从缓存中推出的数据)。
  • 是的,许多处理器提供绕过缓存的指令。有关 CPU、GPU 和 CPU-GPU 系统的信息,请参阅我的详细信息 survey paper on cache bypassing techniques。它还讨论了绕过的好处、挑战和权衡。

标签: assembly x86 processor cpu-cache instructions


【解决方案1】:

一般来说,缓存策略由内存管理单元 (MMU) 控制。对于每个地址范围,都会确定一个缓存策略。这些表由操作系统管理并且在系统空间中可用。 作为对您可能想问的问题的补充回答,对于具有缓存的架构,通常有 CPU 命令可用于同步/无效/刷新缓存。但是,与 MMU 表一样,这些命令也仅在系统空间中可用。

【讨论】:

  • 稍微澄清一下;在 x86 上,clflush 指令(使 single 缓存行无效)是 not 特权的。而且,正如原始海报所提到的,movnt SSE 指令允许缓存绕过 stores - 请参阅stackoverflow.com/questions/37070/… 了解详细信息。
【解决方案2】:

是否有任何此类处理器具有绕过特定数据缓存的指令?

SuperH 系列(或至少 SuperH-2)具有隐式和显式绕过其缓存内存的功能。这是通过使用内存地址空间的不同区域来完成的,而不是通过特殊指令。
通过将地址的前 3 位设置为 001,您将访问同一地址的 cache-through 镜像,但前 3 位被清除。并且某些区域(例如内存映射的 I/O 寄存器)永远不会被缓存。

【讨论】:

    【解决方案3】:

    SSE 缓存绕过存储指令是为了避免在写入不会很快再次触及的区域时污染缓存。例如您不想驱逐将再次使用的数据。

    此外,当写入缓存行的任何部分时,x86 实现通常会读取整个缓存行。如果不需要缓存行的先前内容,这是对内存带宽的浪费。 (例如,memcpymemsetdest arg。)我发现此回写(默认)的 some old discussion 与实现 memcpy 的写组合(movntq / movntdq)效果.如果其他东西会立即读取memcpy 的输出,请小心使用它。

    流式加载仅适用于reading from USWC regions,正常情况下memcpy 在这种情况下的表现非常糟糕。来自正常(WB(写回))的流式加载目前并不特殊,并且像常规 movdqa 加载一样工作。 (即忽略 NT 提示)。英特尔的优化手册说你可以使用prefetchnta 来减少污染。


    IDK 如果可以写入缓存(而不是绕过movnt)而不触发读取。 AVX512 可能会为memcpy 解决这个问题,因为 512b ZMM 寄存器是 64 字节,即一个完整的高速缓存行。从 ZMM 寄存器到尚未缓存的内存的 64 字节对齐存储可以以不首先读取 RAM 的方式实现,并且仍然使存储立即对其他人可见系统中的 CPU 内核。

    AVX-512 将出现在 Skylake Xeon(不是其他 skylake CPU)中。也在 Knight's Landing,大规模并行高吞吐量 Xeon Phi 计算加速器中。)

    【讨论】:

      【解决方案4】:

      Altera Nios II 架构有 2 条特定指令 ldiostio 用于绕过缓存的加载/存储。它们用于内存映射 IO。

      http://www.csun.edu/~glaw/ee525/Lecture03Nios.pdf

      Nios II 是一种软处理器,通常用于 Altera 的 FPGA 板,虽然它也可以用于硬 ASIC 设备,但我不知道任何基于这种架构的商业 CPU

      【讨论】:

        【解决方案5】:

        根据您对特定数据的定义,可以。处理器通常具有缓存控制寄存器/表,用于定义可以缓存哪些内存区域与哪些不能缓存。通常,在用户空间中运行的代码无法访问这些表。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-12
          • 2012-02-07
          相关资源
          最近更新 更多