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

是否有任何此类处理器具有绕过特定数据的缓存的指令? 这个问题也有一个答案,表明SSE4.2指令绕过缓存。 有人可以启发我吗?

通常,缓存策略由内存管理单元(MMU)控制。 对于每个地址范围,决定缓存策略。 这些表由操作系统管理,可在系统空间中使用。 作为您可能要提出的问题的侧边栏答案,对于具有缓存的体系结构,通常有CPU命令可用于同步/无效/刷新缓存。 但是,与MMU表一样,这些命令也仅在系统空间中可用。

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

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

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

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

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

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

SSE高速缓存旁路存储指令用于避免在写入不会很快再次触及的区域时污染高速缓存。 例如,您不想逐出将再次使用的数据。

此外,当写入高速缓存行的任何部分时,x86实现通常在整个高速缓存行中读取。 如果不需要高速缓存行的先前内容,则这是浪费存储器带宽。 (例如memcpymemsetdest arg。)我发现了一些关于实现memcpy的回写(默认)与写入组合( movntq / movntdq )效果的旧讨论 。 如果其他东西会立即读取memcpy的输出,请小心使用它。

流加载仅适用于从USWC区域读取 ,因为正常的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计算加速器。)