_mm_prefetch 是如何工作的?

How _mm_prefetch works?

_mm_prefetch 调用 here 将 RAM 中给定内存位置的内容预取到缓存行。但是缓存完全在硬件控制之下吧?基于哪些内存(基于 spatial/temporal 位置)被大量访问,硬件将内容从内存预取到缓存。我认为程序员无法控制缓存,它完全是一种硬件机制。

所以我的理解是错误的,缓存实际上可以由我们控制,对吧?

如果_mm_prefetch可以控制可以放入缓存的内容,

  1. 这是否意味着它永远不会从缓存中删除?

  2. 什么是等效的汇编级指令 缓存机制?

我们始终可以通过简单地执行内存访问将数据移动到缓存中(如果处于活动状态)。
我们可以通过简单地提前“触摸”它来预取一个 var,我们不需要特殊的指令。

不清楚你所说的“控制缓存”是什么意思,因为我们可以enable/disable它,设置它的模式,它的fill/spill策略和与其他硬件线程的共享模式。
我们还可以用数据填充缓存,并巧妙地使用算术强制逐出一行。

你认为程序员必须控制缓存的任何假设并不完全有效,但并非不正确:CPU 可以自由实施它想要的任何缓存策略,只要它遵守文档规范(包括根本没有缓存或每 X 个时钟滴答溢出缓存)。
我们还不能做的一件事是在缓存中固定行,我们不能告诉 CPU 永远不要驱逐特定行。

EDIT 正如评论中的 ,可以将数据固定到较新的 Intel CPUs 中的 L3 缓存中。


_mm_prefetch 被编译成的 PREFETCHT0, PREFETCHT1, PREFETCHT2, PREFETCHTNTA and PREFETCHWT1 指令只是对硬件预取器的提示(如果存在、活动并且愿意遵守提示)1.

3 更多来自 对缓存层次结构级别的更精细控制 数据将停在 减少核心资源的使用2,而不是将数据移动到缓存中。

一旦某行被预取,它就会像其他任何行一样从缓存中删除。


1 这些硬件预取器通常由内存访问模式(如顺序访问)触发,并且相对于执行流程是异步的。

2 它们本质上是异步的(在本地快速完成)并且可能不会污染负载可能会产生的核心资源(例如寄存器、负载单元等)。

3 虽然人们可能认为提示在最坏的情况下是无用的(如果不遵守),但实际上 turns out that prefetch degrates the performance.