是否有任何此类处理器具有绕过特定数据缓存的指令?这个问题也有一个答案,表明 SSE4.2 指令确实绕过了缓存。有人可以启发我吗?
5 回答
通常,缓存策略由内存管理单元 (MMU) 控制。对于每个地址范围,决定一个缓存策略。这些表由操作系统管理并且在系统空间中可用。作为对您可能打算提出的问题的补充回答,对于具有缓存的架构,通常有 CPU 命令可用于同步/无效/刷新缓存。但是,与 MMU 表一样,这些命令也仅在系统空间中可用。
Altera Nios II 架构有 2 条特定指令ldio
,stio
用于绕过缓存的加载/存储。它们用于内存映射 IO。
http://www.csun.edu/~glaw/ee525/Lecture03Nios.pdf
Nios II 是一个软处理器,通常用于 Altera 的 FPGA 板,虽然它也可以被许可用于硬 ASIC 设备,但我不知道任何基于这种架构的商业 CPU
SSE 缓存绕过存储指令是为了避免在写入不会很快再次触及的区域时污染缓存。例如,您不想驱逐将再次使用的数据。
此外,当写入缓存行的任何部分时,x86 实现通常会读取整个缓存行。如果不需要缓存行的先前内容,这是对内存带宽的浪费。(例如or的dest
arg 。 )我发现了一些关于实现. 如果其他东西会立即读取输出,请小心使用它。memcpy
memset
movntq
movntdq
memcpy
memcpy
流式加载仅适用于从 USWC 区域读取,因为在这种情况下正常memcpy
执行非常糟糕。来自正常(WB(写回))的流式加载目前并不特殊,并且像常规movdqa
加载一样工作。(即忽略 NT 提示)。英特尔的优化手册说您可以prefetchnta
用于减少污染的负载。
movnt
IDK 如果可以在不触发读取的情况下写入缓存(而不是绕过)。AVX512 可能会解决这个问题memcpy
,因为一个 512b ZMM 寄存器是 64 字节,即一个完整的高速缓存行。从 ZMM 寄存器到尚未缓存的内存的 64 字节对齐存储可以以不首先读取 RAM 的方式实现,并且仍然使存储立即对系统中的其他 CPU 内核可见。
(AVX-512将用于Skylake Xeon(而不是其他 Skylake CPU)。也在Knight's Landing中,大规模并行高吞吐量 Xeon Phi 计算加速器。)
是否有任何此类处理器具有绕过特定数据缓存的指令?
SuperH 系列(或至少 SuperH-2)具有隐式和显式绕过其高速缓存的功能。这是通过使用内存地址空间的不同区域来完成的,而不是通过特殊指令。
通过将地址的前 3 位设置为 ,001
您将访问同一地址的高速缓存镜像,而前 3 位被清除。并且某些区域(例如内存映射的 I/O 寄存器)永远不会被缓存。
根据您对特定数据的定义,是的。处理器通常具有缓存控制寄存器/表,用于定义可以缓存哪些内存区域与哪些不能缓存。通常,在用户空间中运行的代码无法访问这些表。