【发布时间】:2019-07-18 01:38:53
【问题描述】:
问题更多是关于 DRAM 的工作原理。
(用 C 术语说)如果我有一个本地(位于堆栈上)变量和一个全局(静态或动态分配)变量,哪一个访问得更快? 考虑到两者都没有被缓存或放在寄存器中!
所以实际的问题是检索靠近先前接触区域的数据是否比检索完全不同位置的数据更快,例如行地址和列地址与以前不同。
如果访问时间确实存在差异,为什么?
【问题讨论】:
标签: performance memory ram
问题更多是关于 DRAM 的工作原理。
(用 C 术语说)如果我有一个本地(位于堆栈上)变量和一个全局(静态或动态分配)变量,哪一个访问得更快? 考虑到两者都没有被缓存或放在寄存器中!
所以实际的问题是检索靠近先前接触区域的数据是否比检索完全不同位置的数据更快,例如行地址和列地址与以前不同。
如果访问时间确实存在差异,为什么?
【问题讨论】:
标签: performance memory ram
一般来说没有区别。无论给定地址是在堆栈上还是在堆上,DRAM 的工作原理都是一样的。在实践中,有几种情况局部变量通常更快:
使事情复杂化的是,“本地/全球”可能不是您真正想要的区别。例如,许多语言都有像全局变量一样实现的“静态局部”变量,但在词法上是局部的,而在词法上是非局部的但存储在堆栈上的“线程局部”变量。如果你在调用链的下游通过引用传递一个本地分配的变量,它最终会从缓存中掉出来,表现得完全像一个全局变量。
【讨论】:
所以问题是
检索接近先前接触的数据是否更快 区域而不是检索完全不同位置的数据
答案是肯定的,它更快。
TL;DR: DRAM 有一个缓冲区(如果你愿意的话,是一个缓存,虽然它不是真正的缓存)
原因在于 DRAM 的工作原理。
如果 IC 编号为 0 到 K,bank 0 到 M,行 0 到 N;
那么行 (0, m, n), (1, m, n) ... (K, m, n) 构成一个内存页(连续地址的数据)。
(常见情况)如果给定的 SIMM 每个 rank 有 8 个 IC,并且一个 bank 有 1024 列(每列是一个字节),那么一个内存页面(或整个缓冲内存)的大小为 8KB。
话虽如此,如果您访问的地址与为同一存储体请求的最后一个地址位于同一内存页上,则只会使用列解码器,这比该地址快 2 倍在不同的页面上。注意:2 倍的差异仅与 DRAM 相关,与到达 CPU 的总时间无关,仍为 >100ms。
还有很多细节要补充,但我一点也不精通。
附:这个话题没有被广泛讨论,以上所有内容只是一个非常简短的概述,通过检查写得不太好的信息对我来说是有意义的。
【讨论】: