【发布时间】:2011-03-19 22:33:08
【问题描述】:
编辑 - 我想我问的问题太长了,所以我把它说得很具体。
问题:如果内存位置在 L1 缓存中并且未标记为脏。假设它有一个值 X。如果你尝试将 X 写入同一个位置会发生什么?是否有任何 CPU 会看到这样的写入是多余的并跳过它?
例如,是否有比较两个值并丢弃冗余写回主存储器的优化?具体来说,主流处理器是如何处理的?当值是像 0 这样的特殊值时呢?如果即使是像0这样的特殊值也没有这样的优化,那是有原因的吗?
动机:我们有一个可以轻松放入缓存的缓冲区。多个线程可能会通过相互回收来使用它。每次使用都涉及写入缓冲区中的 n 个位置(不一定是连续的)。回收只是意味着将所有值设置为 0。每次回收时,size-n 个位置已经为 0。在我看来(直观地)避免如此多的冗余回写将使回收过程更快,并且因此问题。
在代码中这样做没有意义,因为分支指令本身可能会导致不必要的缓存未命中(if (buf[i]) {...} )
【问题讨论】:
-
这是一个非常大的问题,高度依赖于架构。以下是有关可能与您的任务相关或至少可以帮助您更好地提出问题的技术的英特尔应用说明:software.intel.com/en-us/articles/…
-
我认为那篇文章没有回答我的问题。我读过很多关于缓存的文章,但没有提到任何地方的相同值。非常感谢您提供具体信息。
-
我通常主张许多性能问题可以通过思考来回答 - 但这次我很想看看一些测量的结果。 (轻推)
-
虽然l1缓存与cpu密切相关,但这是一个内存系统/缓存问题而不是cpu问题。请参阅我在 rwongs 答案下的回复,您要么什么都不保存,要么失去一个时钟周期,并添加不必要的逻辑。 github.com/dwelch67/amber_samples 或直接访问 opencores 并获取 amber 项目。 amber25版本有缓存,开源,随意修改,看看区别。
标签: language-agnostic optimization caching computer-architecture