让我们假设一种算法正在重复处理数据缓冲区,它可能正在访问这些缓冲区中的2到16个,它们都具有相同的大小。假设算法可以在较小的块中处理完整数据,那么您期望的是这些缓冲区的最佳大小。
我预计,如果块太大,则可能会丢失高速缓存的瓶颈,但是,当然,块越大,矢量化效果越好。
让我们期待当前的i7 / i9 CPU(2018)
有什么想法吗?
答案 0 :(得分:0)
您有多个线程吗?您可以安排事物以便同一线程重复使用同一缓冲区吗? (即,尽可能使缓冲区与线程关联)。
现代Intel CPU每核具有32k L1d,256k L2专用。 (或者Skylake-AVX512具有1MiB专用L2缓存,共享的L3较少)。 (Which cache mapping technique is used in intel core i7 processor?)
在大多数情况下,针对L2命中目标是不错的。 L2未命中/ L3命中有时并不总是很糟糕,但离核心的速度要慢得多。请记住,L2是一个统一的缓存,因此它也涵盖了代码,当然还有堆栈存储器和对L2的随机其他需求。因此,将缓冲区总大小设置为L2大小的一半通常会为缓存阻塞提供良好的命中率。
取决于算法可以使用多少带宽,您甚至可能主要针对L1d命中,但是较小的缓冲区可能意味着更多的启动/清理开销以及在主循环之外花费更多的时间。
还请记住,通过超线程,每个逻辑核心都在竞争其运行的物理核心上的缓存。因此,如果两个线程最终位于同一个物理内核上,但它们所使用的内存却完全不同,那么您的有效缓存大小大约为一半。
可能您应该将缓冲区大小设置为可调参数,并使用一些不同大小的配置文件。
使用性能计数器来检查您是否实际上在避免L1d或L2丢失(大小不同),以帮助您了解代码是否对不同数量的内存延迟敏感。