【发布时间】:2017-03-27 08:33:19
【问题描述】:
Hennessy-Patterson 关于计算机体系结构的书(定量方法 5ed)说,在具有多个存储体的向量体系结构中,如果满足以下条件,则可能发生存储体冲突(第 279 页,5ed):
(银行数)/LeastCommonMultiple(银行数,步幅)
但是,我认为应该是GreatestCommonFactor而不是LCM,因为如果你拥有的有效bank数小于忙碌时间,就会发生内存冲突。我的意思是有效的银行数量 - 假设你有 8 个银行,步长为 2。那么实际上你有 4 个银行,因为内存访问只会在四个银行排队(例如,假设你的访问都是偶数,从 0 开始,那么你的访问将在银行 0,2,4,6 排队。
事实上,这个公式甚至在它下面给出的例子中都失败了。 假设我们有 8 个内存库,繁忙时间为 6 个时钟周期,总内存延迟为 12 个时钟周期,完成步长为 1 的 64 元素向量加载需要多长时间? - 这里他们将时间计算为 12+64=76 个时钟周期。但是,根据给定的条件,内存库会发生冲突,因此我们显然不能每个周期访问一次(等式中为 64)。
是我弄错了,还是错误的公式在这本书的 5 个版本中存活下来(不太可能)?
【问题讨论】:
-
听起来不错,如果它像 Intel Sandybridge 的 L1 缓存一样工作,其中每对缓存线(总共 128B)被分成 8 个 16B 的 bank,不同行中来自同一 bank 的并发加载是一个 bank冲突。 (但同一行中同一银行的两次读取可能发生在同一循环中)。 Agner Fog's microarch pdf 描述了它。 Haswell 和之后的版本没有存储库冲突,因此这只适用于 SnB 和 IvB,它们是支持每个时钟两次读取的前两代英特尔微架构。
标签: vectorization hardware cpu-architecture processor