读写位置之间的距离是否会影响缓存性能?

问题描述 投票:0回答:2

我有一个大小为n的缓冲区,它是一个空的大小为n的后继缓冲区。我想在i位置的第一个缓冲区中插入一个值,但为了做到这一点,我需要向前移动一系列内存,因为缓冲区已满(即顺序插入)。我有两个选择:

首选写入接近读(邻近):

  1. 将第一个缓冲区的最后一个值推入第二个缓冲区。
  2. 在第一个缓冲区中向前移动in - 1
  3. i插入。

更喜欢步骤:

  1. 将范围i从第一个缓冲区复制到n - 1到第二个缓冲区。
  2. i插入。

我能找到的大部分内容只是讨论了读取上下文中的局部性,我想知道是否应该考虑读取和写入内存之间的距离。

c performance
2个回答
1
投票

读写位置之间的距离是否会影响缓存性能?

是。通常情况下(不包括CPU可以使用新数据写入整个缓存行的罕见情况),CPU必须在执行写操作之前将最新版本的缓存行提取到其缓存中。如果高速缓存行已经在高速缓存中(例如,由于先前读取了碰巧在同一高速缓存行中的一些其他数据),则CPU在执行写入之前不需要获取高速缓存行。

请注意,还有其他各种怪癖(缓存别名,TLB未命中等);并且所有这些都取决于具体的情况和CPU(例如,如果所有进程的数据都适合CPU的缓存,没有共享内存,并且没有任务切换或使用CPU的其他进程;那么你可以假设无论如何,一切都将永远在缓存中。

我想在i位置的第一个缓冲区中插入一个值,但为了做到这一点,我需要向前移动一系列内存,因为缓冲区已满(即顺序插入)。

没有更多信息(这种情况发生的频率,涉及多少数据等)我无法提出任何建议。然而(乍一看,没有太多信息),整个想法似乎很糟糕。更具体地说,听起来你增加了一堆麻烦,使两个较小的阵列表现得与一个较大的阵列完全相同(然后担心插入成本,因为阵列通常不适合插入)。


1
投票

这是最低级别的数据结构内部的一个组件,其中n很小并且是常量

通过小我假设你的意思是小于L1 cpu缓存小于1MB或L2缓存高达10-20 MB,这取决于你的CPU然后没有,

我想知道是否应该考虑读和写存储器之间的距离。

有时;如果所有数据都适合进程正在运行的CPU L1,L2,L3缓存,那么您认为随机访问意味着应用它将是相同的延迟。您可以获得细节并深入研究L1,L2,L3缓存之间的差异,但为了简洁起见(我只是理所当然地认为)在内存边界内的任何地方,访问的延迟都是相同的。所以在你的情况下,N很小,如果它都适合cpu缓存(许多边界中的第一个),那么你选择移动/改变值的方式和效率以及你最终做的那样这会影响性能(完成时间)。

现在,如果N很大,例如在2个或更多套接字系统中(通过intel QPI或UPI)并且数据位于跨越QPI或UPI路径到内存的DDR RAM中,则会关闭另一个CPU的内存控制器,然后肯定是大的性能命中(相对而言)因为现在已经越过边界,这将是不能适应进程运行的CPU的缓存(最初从DIMMS LOCAL获取到该cpu内存控制器) )现在通过QPI或UPI路径引发与其他CPU通话的开销(与先前的架构相比仍然非常快),然后其他CPU从其内存DIMM集中取出数据并通过QPI或UPI将其发送回cpu你的进程正在运行。

因此,当您将L1高速缓存限制超过L2时,同样会在L3高速缓存中产生性能损失,所有这些都在一个CPU内。当一个进程必须重复从它的本地dimms集中获取更多数据时,它无法适应缓存然后性能受到影响。并且当该数据不在本地的dimms时cpu =较慢。当这些数据不在同一主板上并且遇到某种高速光纤时RDMA =较慢。当它越过以太网甚至更慢......等等。

© www.soinside.com 2019 - 2024. All rights reserved.