【问题标题】:Condition for memory access conflict in memory-banked vector processors内存库矢量处理器中内存访问冲突的条件
【发布时间】: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


【解决方案1】:

GCD(banks, stride) 应该加入其中;你的论点是正确的。

让我们尝试几个不同的步骤,看看我们得到了什么, 银行数量 = b = 8.

# generated with the calc(1) function
define f(s) { print s, "     |   ", lcm(s,8), "    |   ", gcd(s,8), "    |   ", 8/lcm(s,8), "      |   ", 8/gcd(s,8) }`

stride | LCM(s,b) | GCF(s,b) | b/LCM(s,b) |  b/GCF(s,b)
1      |    8     |    1     |    1       |    8     # 8 < 6 = false: no conflict
2      |    8     |    2     |    1       |    4     # 4 < 6 = true:  conflict
3      |    24    |    1     |   ~0.333   |    8     # 8 < 6 = false: no conflict
4      |    8     |    4     |    1       |    2     # 2 < 6 = true: conflict
5      |    40    |    1     |    0.2     |    8
6      |    24    |    2     |   ~0.333   |    4
7      |    56    |    1     |   ~0.143   |    8
8      |    8     |    8     |    1       |    1
9      |    72    |    1     |   ~0.111   |    8

x         >=8        2^0..3      <=1          1 2 4 or 8

b/LCM(s,b) 总是

我认为 GCF(又名 GCD)看起来适合我目前看到的步幅值。只有当 stride 没有将访问分配到所有银行时,您才会遇到问题,这就是 b/GCF(s,b) 告诉您的。


Stride = 8 应该是最坏的情况,每次都使用同一个银行。 gcd(8,8) = lcm(8,8) = 8。所以这两个表达式都给出了 8/8 = 1,它小于银行忙/恢复时间,因此可以正确预测冲突。

Stride=1 当然是最好的情况(如果有足够的银行来隐藏繁忙时间,则不会发生冲突)。 gcd(8,1) = 1 正确预测没有冲突:(8/1 = 8,不小于 6)。 lcm(8,1) = 8。(8/8 &lt; 6 为真)错误地预测冲突。

【讨论】:

  • 所以这两个表达式似乎都是假的,给出的 8/8 = 1 小于银行繁忙/恢复时间,因此预测没有冲突 - 我认为有一个这里的小错误。该条件表明,如果不等式满足,则存在冲突。对于步幅 8,不等式得到满足,因此存在冲突。对于步幅 1,gcd 会改为预测 no 冲突。事实上,对于 stride 1,确实不会有任何冲突——因为你有 8 个银行,而忙碌时间是 6。所以当你回到 bank#1 时,你已经花费了 8 个周期,因此第一个银行又免费了。
  • @ParthThakkar:是的,不仅仅是一个小错误;我的整个结论是错误的!我在某些时候混淆了并颠倒了冲突/无冲突。解决这个问题后,我认为 GCD 在 H&P 的公式中起作用是对的。恭喜你发现了一个错误,你应该给他们发一封电子邮件让他们知道。
  • 我想我会这样做。感谢您的确认。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
  • 2017-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2015-07-31
相关资源
最近更新 更多