|
0
|
| VojtÄch Melda Meluzín · 技术社区 · 7 年前 |
|
1
0
你有多条线吗?你能安排相同的线程重复使用相同的缓冲区吗?(即,尽可能保持缓冲区与线程关联)。 现代英特尔CPU拥有32k L1d,256k L2专用内核。(或者Skylake-AVX512有1MiB专用二级缓存,共享的三级缓存更少)。( Which cache mapping technique is used in intel core i7 processor? ) 大多数时候瞄准二级打击是好的。L2未命中/L3命中在某些情况下并不总是很糟糕,但离核速度明显较慢。记住,二级缓存是一个统一的缓存,所以它也涵盖了代码,当然还有堆栈内存和对二级缓存的随机其他需求。因此,将缓冲区总大小控制在二级缓存大小的一半左右,通常会为缓存阻塞提供很好的命中率。 根据你的算法可以使用多少带宽,你甚至可以瞄准大部分L1d命中,但是小的缓冲区可能意味着更多的启动/清理开销,并在主循环之外花费更多的时间。 还要记住,在超线程中,每个逻辑核心都在运行它的物理核心上竞争缓存。因此,如果两个线程最终在同一个物理核心上,但接触到完全不同的内存,那么有效的缓存大小约为一半。 可能应该将缓冲区大小设置为一个可调参数,并使用几个不同大小的配置文件 . 使用perf计数器检查是否实际避免了不同大小的L1d或L2未命中,以帮助您了解代码是否对不同数量的内存延迟敏感。 |