冗余写入时的缓存行为

时间:2010-07-23 05:39:08

标签: language-agnostic optimization caching computer-architecture

编辑 - 我想我问的问题太长了,所以我非常具体。

问题:如果内存位置在L1缓存中并且未标记为脏。假设它有一个值X.如果你尝试将X写入同一位置会发生什么?是否有任何CPU会发现这样的写操作是多余的并跳过它?

例如,是否存在比较这两个值的优化并丢弃冗余写回主存储器?具体来说主流处理器如何处理这个?当值是0这样的特殊值时怎么样?如果即使对于像0这样的特殊值也没有这样的优化,是否有原因?

动机:我们有一个可以轻松放入缓存的缓冲区。多线程可以通过在它们之间回收来使用它。每次使用都涉及写入缓冲区中的 n 位置(不一定是连续的)。回收只是意味着将所有值设置为0.每次回收时, size-n 位置已经为0.对我而言,直观地说,避免如此多的冗余回写将使回收过程更快,因此问题。

在代码中执行此操作没有意义,因为分支指令本身可能会导致不必要的缓存未命中(if(buf [i]){...})

3 个答案:

答案 0 :(得分:1)

您建议的硬件优化不会减少延迟。考虑最低级别的操作:

  1. 该位置的旧值从缓存加载到CPU(假设它已经在缓存中)。
  2. 比较新旧价值。
  3. 如果旧值和新值不同,则将新值写入缓存。否则会被忽略。
  4. 步骤1实际上可能比步骤2和3花费更长的时间。这是因为步骤2和3无法启动,直到步骤1中的旧值进入CPU。如果用软件实现,情况就会一样。

    考虑我们是否只是将新值写入缓存,而不检查旧值。它实际上比上面提到的三步过程更快,原因有两个。首先,没有必要等待旧值。其次,CPU可以简单地在输出缓冲器中调度写操作。输出缓冲区可以同时执行缓存写入,而ALU可以开始处理其他内容。

    到目前为止,所涉及的唯一延迟是CPU和缓存之间的延迟,而不是缓存和主存储器之间的延迟。


    现代微处理器的情况更为复杂,因为它们的缓存被组织成缓存行。当字节值写入缓存行时,必须加载完整的缓存行,因为未重写的缓存行的其他部分必须保留其旧值。

    http://blogs.amd.com/developer/tag/sse4a/

    • 缓存命中:数据从缓存行读取到目标寄存器
    • 缓存未命中:数据从内存移动到缓存,并读入目标寄存器
    • 缓存命中:数据从寄存器移动到缓存行
    • 缓存未命中:缓存行被提取到缓存中,来自寄存器的数据被移动到缓存行

答案 1 :(得分:1)

我不知道有任何处理器执行您描述的优化 - 消除写入以清除不会改变值的缓存行 - 但这是一个很好的问题,一个好主意,伟大的思想相似等等。

我写了一篇很棒的回复,然后我记得:这在文献中被称为“沉默的商店”。参见“免费沉默商店”,K。Lepak和M Lipasti,UWisc,MICRO-33,2000。

无论如何,在我的回复中,我描述了一些实施问题。

顺便说一句,像这样的主题经常在USEnet新闻组comp.arch中讨论。

我也在我的维基上写了http://comp-arch.net

答案 2 :(得分:0)