【发布时间】:2019-11-16 11:55:42
【问题描述】:
(我的问题是关于计算机架构和性能理解的问题。没有找到相关的论坛,所以在这里作为一般问题发布。)
我有一个C 程序,它访问在虚拟地址空间中相隔 X 字节的内存字。例如,for (int i=0;<some stop condition>;i+=X){array[i]=4;}。
我用变化的值X 测量执行时间。有趣的是,当X 是2 的力量并且大约是页面大小时,例如X=1024,2048,4096,8192...,我的性能会大幅下降。但是对于X 的所有其他值,例如1023 和1025,没有减速。性能结果见下图。
我在几台个人机器上测试我的程序,所有机器都在 Intel CPU 上运行带有 x86_64 的 Linux。
这种放缓的原因可能是什么?我们在 DRAM、L3 缓存等中尝试过行缓冲区,这似乎没有意义......
更新(7 月 11 日)
我们在这里做了一个小测试,将 NOP 指令添加到原始代码中。放缓仍然存在。这有点否决了 4k 别名。冲突缓存未命中的原因更可能是这里的情况。
【问题讨论】:
-
您可能需要提及它是哪个 CPU(Intel Atom 与 Netburst 非常不同,它们都与 Sandy Bridge 非常不同,后者与 Haswell 略有不同;甚至同一个微架构中稍微不同的 CPU 模型具有不同的缓存大小),另外,如果页面被填充/存在,阵列有多大(如果它太大以至于所有翻译都无法容纳在 CPU 的 TLB 和/或某些缓存中)如果 TLB 被“加热”。对于随机猜测,我会怀疑某处存在混叠情况(可能是 L2 数据缓存?)。
-
y 轴代表什么?显示用于生成图形的整个代码、它是如何编译的以及它在哪个 CPU 上运行。
-
我认为 4k 别名对于纯商店来说并不重要,只是商店和负载的混合。可以将存储写入存储缓冲区,而无需确定它是否与较早或较晚的存储重叠。这就是为什么我在这里的回答中说 4k 混叠可能没有解释它,即使它通常是大步幅的问题。
-
是的,我同意原因可能是缓存未命中并将更新 OP。
-
添加 NOP 不会显示任何内容。加载和存储不一定要背靠背才能发生 4K 混叠。如果您不提供我在之前评论中要求的信息,则很难为您提供帮助。
标签: performance memory cpu-architecture cpu-cache