Performance 最佳缓冲区大小可避免最近的i7/i9 CPU的缓存未命中

Performance 最佳缓冲区大小可避免最近的i7/i9 CPU的缓存未命中,performance,optimization,x86,cpu-cache,Performance,Optimization,X86,Cpu Cache,让我们假设一个算法正在重复处理数据缓冲区,它可能正在访问这些缓冲区中的2到16个,所有缓冲区都具有相同的大小。假设算法可以在较小的块中处理完整数据,那么这些缓冲区的最佳大小是多少 我预计,如果块太大,可能会出现缓存未命中的瓶颈,但当然,块越大,矢量化效果越好 让我们期待当前的i7/i9 CPU(2018年) 有什么想法吗?你有多个线程吗?你能安排事情让同一个线程重复使用同一个缓冲区吗?(如有可能,保持缓冲区与线程关联) 现代Intel CPU每个核心有32k L1d、256k L2专用。(或者S

让我们假设一个算法正在重复处理数据缓冲区,它可能正在访问这些缓冲区中的2到16个,所有缓冲区都具有相同的大小。假设算法可以在较小的块中处理完整数据,那么这些缓冲区的最佳大小是多少

我预计,如果块太大,可能会出现缓存未命中的瓶颈,但当然,块越大,矢量化效果越好

让我们期待当前的i7/i9 CPU(2018年)


有什么想法吗?

你有多个线程吗?你能安排事情让同一个线程重复使用同一个缓冲区吗?(如有可能,保持缓冲区与线程关联)

现代Intel CPU每个核心有32k L1d、256k L2专用。(或者Skylake-AVX512具有1MB专用二级缓存,共享三级缓存较少)。()

大多数时候瞄准二语命中是好的。二级未命中/三级命中有些时候并不总是很糟糕,但离核速度要慢得多。请记住,二级缓存是一个统一的缓存,因此它也包含代码,当然二级缓存还需要堆栈内存和其他随机需求。因此,将总缓冲区大小控制在二级缓存大小的一半左右通常可以获得很好的缓存阻塞命中率

根据您的算法可以使用的带宽大小,您甚至可以将主要目标放在L1d命中上,但较小的缓冲区可能意味着更多的启动/清理开销,并在主循环之外花费更多的时间


还请记住,对于超线程,每个逻辑核都在其运行的物理核上竞争缓存。因此,如果两个线程最终位于同一个物理核心上,但所接触的内存完全不同,那么有效缓存大小约为一半


可能您应该将缓冲区大小设置为可调参数,并使用一些不同的大小配置文件


使用性能计数器检查您是否确实避免了大小不同的L1d或L2未命中,以帮助您了解代码是否对不同的内存延迟量敏感。

这些缓冲区究竟被访问了哪些内容?算法是否以某种模式读取和写入这些缓冲区?它是否同时访问多个缓冲区?有多少地方?缓冲区可以有多大或多小?可能是尺寸比预取更重要。谢谢。正如我所解释的,每次都会访问几个缓冲区,例如,你有8个缓冲区,每个缓冲区都有1024个浮点数,各种算法都会对它们进行触摸、读写,但在99%的情况下,缓冲区会向前移动,因此会以某种方式从头到尾处理它们。这对我来说仍然很模糊。因此,不同的算法在不同的线程中并行运行或按顺序运行,尽管问题是有一种算法。是否每个算法都需要按顺序访问缓冲区的所有元素?为了简单起见,假设每个算法都访问所有元素,即单线程。我在这里概括了很多。谢谢你的信息!我更喜欢一开始的一些平均值,比如说每个缓冲区4096B,但无论如何都是很好的指针。@VojtěchMeldaMeluzín:如果您知道应用程序如何使用缓冲区,您可以根据目标内存计算缓冲区大小。问题中没有足够的信息来说明什么是有用的。IDK,如果访问16个缓冲区很常见,或者这种情况很少发生。