存储器存储器矢量处理器中存储器访问冲突的条件

Par*_*kar 10 hardware processor vectorization cpu-architecture

Hennessy-Patterson关于计算机体系结构的书(定量方法5ed)表示,在具有多个存储体的矢量体系结构中,如果满足以下条件,则可能发生银行冲突(参见5):

(银行数量)/ LeastCommonMultiple(银行数量,步幅)<银行繁忙时间

但是,我认为它应该是GreatestCommonFactor而不是LCM,因为如果您拥有的有效银行数量少于繁忙时间,则会发生内存冲突.有效数量的银行我的意思是这个 - 假设你有8个银行,并且步幅为2个.那么实际上你有4个银行,因为内存访问只能在四个银行排队(例如,假设您的访问都是偶数,从0开始,然后你的访问将在0,2,4,6银行排队.

实际上,这个公式甚至不适用于它下面给出的例子.假设我们有8个存储器组,其繁忙时间为6个时钟周期,总存储器延迟为12个时钟周期,以1的步幅完成64个元素的向量加载需要多长时间? - 这里他们计算时间为12 + 64 = 76个时钟周期.但是,根据给定的条件会发生存储库冲突,因此我们显然不能在每个周期中进行一次访问(方程式中为64).

我是错了,还是错误的公式能够在本书的5个版本中生存(不太可能)?

Pet*_*des 3

GCD(银行、跨步)应该纳入其中;你的论点是正确的。

让我们尝试几个不同的步骤,看看我们会得到什么,对于 number ofbank = 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
Run Code Online (Sandbox Code Playgroud)

b/LCM(s,b) 始终 <=1,因此它始终预测冲突。

我认为 GCF(又名 GCD)看起来很适合我到目前为止所看到的步幅值。只有当步幅没有将访问分配到所有银行时,您才会遇到问题,这就是 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 < 6为真)错误地预测了冲突。

  • 我想我会这么做的。感谢您的确认。:) (2认同)