我有一个大小为n
的缓冲区已满,有一个大小为n
的后继缓冲区。我想在第一个缓冲区中的位置i
上插入一个值,但是由于缓冲区已满(即顺序插入),因此我需要向前移动一定范围的内存。我在这里有两个选择:
首选写接近读(相邻):
i
和n - 1
之间向前移动。i
。最好减少步骤:
i
到n - 1
从第一个缓冲区复制到第二个缓冲区。i
。我所能找到的大部分内容都只是在 read 上下文中谈论局部性,我想知道是否应该考虑读取和写入存储器之间的距离。
答案 0 :(得分:1)
读写位置之间的距离会影响缓存性能吗?
是的。通常(不包括CPU可以用新数据写入整个缓存行的极少数情况),CPU必须在执行写入操作之前将最新版本的缓存行取到其缓存中。如果高速缓存行已经在高速缓存中(例如,由于先前读取的其他数据恰好在同一高速缓存行中),则CPU在执行写操作之前不需要获取高速缓存行。
请注意,还有其他各种怪癖(缓存别名,TLB丢失等);并且所有这些都取决于特定的情况以及哪个CPU(例如,如果所有进程的数据都适合CPU的缓存,其中没有共享内存,也没有使用CPU的任务切换或其他进程;那么您可以假设无论如何,所有内容都会始终保存在缓存中。
我想在第一个缓冲区中的位置
i
上插入一个值,但是由于缓冲区已满(即顺序插入),因此我需要向前移动一定范围的内存。
没有更多信息(这种情况发生的频率,涉及的数据量等等),我真的无法提出任何建议。但是(乍看之下,没有太多信息),整个想法似乎很糟糕。更具体地说,这听起来像是在增加一堆麻烦,以使两个较小的数组的行为与一个较大的数组完全相同(然后担心插入的成本,因为数组通常不利于插入)。
答案 1 :(得分:1)
这是数据结构中最底层的一个组件,其中n是 small 并且恒定
我认为您的意思是小于L1 cpu缓存的大小小于1MB或小于10 MB的L2缓存,具体取决于您的CPU,否,
我想知道是否应该考虑读写存储器之间的距离。
有时;如果所有数据都可以放入进程正在运行的CPU L1,L2,L3缓存中,那么您认为 random access 意味着应用的延迟都相同。您可以精打细算并深入研究L1,L2,L3缓存之间的差异,但是为了简洁起见(我只是认为这是理所当然的),在内存 boundary 中的任何地方都具有相同的访问延迟。因此,在您的情况下,N很小,并且如果所有大小都适合cpu缓存(许多边界中的第一个),那么它将是您选择移动/更改值的方式和效率以及最终执行此操作的次数这会影响性能(完成时间)。
现在,如果 N 很大,例如在2个或更多套接字系统中(通过Intel QPI或UPI),并且该数据驻留在跨QPI或UPI到内存路径的DDR RAM上使另一个CPU的内存控制器变暗,那么肯定会造成较大的性能影响(相对而言),因为现在已经跨越了 boundary ,这将无法容纳CPU的缓存。进程正在运行(最初是从DIMMS LOCAL提取到该CPU内存控制器的),现在会产生通过QPI或UPI路径与其他CPU通讯的开销(尽管与以前的体系结构相比仍然非常快),然后其他CPU会获取来自它的一组内存DIMMS的数据,然后通过QPI或UPI将其发送回运行您的进程的CPU。
因此,当您超过L1缓存限制到L2时,都会对一个CPU造成性能影响,同样也会影响L3缓存。当一个进程不得不从本地的一组暗调中重复获取更多无法容纳到缓存中的数据时,将会影响性能。并且当该数据不在该CPU本地的调光=较慢时。当这些数据不在同一块主板上并且通过某种高速光纤时,RDMA =更慢。当通过以太网时,速度甚至会更慢……等等。