
[英]What happens to a cache line that maps to a memory area that's subsequently deallocated?
[英]What is the cache's role when writing to memory?
我有一个函数,它很少读取内容,但会大量写入RAM。 当我在同一个内核(主线程)上多次运行它时,它的运行速度大约是每次运行在新线程上启动该函数的速度(它不保证两次运行之间使用相同的内核)时,其运行速度大约是后者的5倍。我启动并在跑步之间加入。
这表明高速缓存在写入过程中被大量使用,但我不知道如何使用。 我认为缓存仅对读取有用。
现代处理器通常具有写缓冲区。 原因是写近似于纯接收器。 在执行下一条指令之前,处理器通常不必等待存储到达一致性存储器层次结构。
(此外:显然,存储不是纯接收器。稍后从写入到内存的位置读取应返回写入值,因此处理器必须监听写入缓冲区,并停止读取或将写入值转发给它)
显然,此类缓冲区的大小是有限的,因此,当缓冲区已满时,程序中的下一个存储区将无法执行,并且将停止运行,直到较旧的存储区提供了缓冲区中的插槽,从而在体系结构上可见。
通常,写操作离开缓冲区的方式是将值写到高速缓存时(由于实际上很快又重新读了很多写操作, 因此请以程序堆栈为例)。 如果只写设置高速缓存行的一部分,则其余高速缓存行必须保持未修改状态,因此必须从内存层次结构中加载它。
有一些方法可以避免加载旧的高速缓存行,例如非临时存储,写合并内存或高速缓存行清零指令。
非临时存储和写合并内存将相邻的写操作组合在一起以填充整个高速缓存行,然后将新的高速缓存行发送到内存层次结构以替换旧的高速缓存行。
POWER的指令将整个dcbz
缓存行( dcbz
) dcbz
,这也消除了从内存中加载旧值的需要。
86与AVX512具有超高速缓存行大小的寄存器,这表明了一个对齐zmm
-register店可能避免加载旧的缓存行(虽然我不知道是否如此)。
注意,这些技术中的许多技术与相应处理器体系结构的常规存储顺序不一致。 使用它们可能需要在多线程操作中使用其他防护。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.