Language agnostic 冗余写操作上的缓存行为
编辑-我想我问的问题太长了,所以我把它说得很具体 问题:如果内存位置在一级缓存中且未标记为脏。假设它有一个值X。如果您尝试将X写入同一位置,会发生什么?有没有CPU会发现这样的写入是多余的并跳过它 例如,是否有一种优化方法比较这两个值并丢弃对主内存的冗余写回?具体来说,主流处理器如何处理这个问题?如果该值是一个特殊值(如0),该怎么办?如果即使对于像0这样的特殊值也没有这样的优化,有什么原因吗 动机:我们有一个可以轻松放入缓存的缓冲区。多个线程可能通过在它们之间循环使用它。每次使用都涉及写入缓冲区中的n位置(不一定是连续的)。循环只是意味着将所有值设置为0。每次我们回收时,size-n位置已经为0。在我看来(凭直觉)避免如此多的冗余回写会使回收过程更快,因此问题就来了 在代码中这样做没有意义,因为分支指令本身可能会导致不必要的缓存丢失(if(buf[i]){…})Language agnostic 冗余写操作上的缓存行为,language-agnostic,optimization,caching,computer-architecture,Language Agnostic,Optimization,Caching,Computer Architecture,编辑-我想我问的问题太长了,所以我把它说得很具体 问题:如果内存位置在一级缓存中且未标记为脏。假设它有一个值X。如果您尝试将X写入同一位置,会发生什么?有没有CPU会发现这样的写入是多余的并跳过它 例如,是否有一种优化方法比较这两个值并丢弃对主内存的冗余写回?具体来说,主流处理器如何处理这个问题?如果该值是一个特殊值(如0),该怎么办?如果即使对于像0这样的特殊值也没有这样的优化,有什么原因吗 动机:我们有一个可以轻松放入缓存的缓冲区。多个线程可能通过在它们之间循环使用它。每次使用都涉及写入缓冲
这不是对您最初关于计算机体系结构问题的回答,但可能与您的目标有关 在本讨论中,所有数组索引都以零开始
假设n比size小得多,请更改算法,使其保存两条信息:
也可以使用类似的技术,称为两级直方图或基数直方图 存储两条信息:
的数组
ceil(size/M)
的布尔数组,其中M
是基数ceil
是天花板功能floor(k/M)
比如说,bool\u数组[j]
被标记。这对应于全尺寸阵列中从j*M
到(j+1)*M-1
的范围
当需要清除全尺寸数组时,请扫描布尔数组中的任何标记元素,并应清除全尺寸数组中相应的范围。您建议的硬件优化不会减少延迟。考虑最低级别的操作:
在现代微处理器中,情况更为复杂,因为它们的缓存被组织成缓存线。当字节值写入缓存线时,必须加载完整的缓存线,因为未重写的缓存线的其他部分必须保留其旧值 阅读 缓存命中:数据从缓存线读取到目标寄存器
我不知道有哪个处理器会像你描述的那样进行优化——消除对干净缓存线的写操作,这不会改变值——但这是一个好问题,一个好主意,伟人的想法都是一样的 我写了一个很好的回复,然后我想起了:这在文学中被称为“无声商店”。见“免费无声商店”,K.Lepak和M Lipasti,UWisc,MICRO-332000 无论如何,在我的回复中,我描述了一些实现问题 顺便说一下,像这样的话题经常在USEnet新闻组comp.arch中讨论
我也在我的维基上写了关于它们的文章,这是一个非常大的问题,高度依赖于体系结构。下面是一篇英特尔应用程序说明,内容可能与您的任务有关,或者至少有助于您更好地阐述问题:我认为这篇文章没有回答我的问题。我读过很多关于缓存的文章,但没有一篇是关于我的