如果每次访问都有读取错过,使用缓存有什么好处吗?
我的问题旨在更好地理解缓存。
每次访问的读取错过也可能在冷启动期间发生,我是对的吗?
答案 0 :(得分:2)
如果您只进行读取,并且在每次读取时都错过了所有级别的缓存,那么按照定义缓存并没有帮助。您支付额外的功率和延迟来检查每个级别的缓存,以及额外的功率和(可能)延迟加载整个缓存行的数据,这些数据永远不会被使用(按照定义),除了您读取的数据,因为您的所有访问都会丢失
你没有说你正在做只读。因此,当然,如果您的所有内容都会丢失,但某些内容会被写入,则缓存可以提供帮助。
也许你的意思是所有访问的读取部分,包括读取和写入,都未命中 - 写入的读取部分是读取所有权访问存在于大多数基于缓存的系统上,其中必须先写入缓存行(其中一部分)才能写入缓存行。在这种情况下,缓存可能也没有帮助,可能会受到伤害。
每次访问的读取错过也可能在冷启动期间发生,我是对的吗?
不,几乎从不。一些读取将会丢失,但是这些读取将在相同的高速缓存行上引入相邻数据,这通常会导致稍后的命中(空间局部性)。即使在冷启动(时间局部性)中,许多读数也将返回到相同位置,这也经常会发生。即使超出单个高速缓存行的动态,现代CPU通常提供硬件预取,它将识别某些访问模式,并在您需要之前引入数据,即使您第一次访问高速缓存行也可能导致命中。
最后,在大多数通用硬件上,你通常无法决定简单地“不使用缓存”,所以即使你的命中率很低,你也要付出内置的缓存成本。
也就是说,有时,当您知道您的访问模式时,您可以向CPU提供提示。例如,x86 CPU提供“非临时存储”指令,这些指令在使用时基本上绕过缓存 - 这意味着不会缓存存储的缓存行。这不一定有助于加快商店本身的速度(这仍然主要支付融入硬件的缓存层次结构的价格),但为了避免用数据污染缓存,开发人员知道不会很快访问。