Hennessy-Patterson关于计算机体系结构的书(定量方法5ed)表示,在具有多个存储体的矢量体系结构中,如果满足以下条件,则可能发生银行冲突:
(银行数)/ LeastCommonMultiple(银行数,步幅)<银行忙碌时间
但是,我认为它应该是GreatestCommonFactor而不是LCM,因为如果您拥有的有效银行数小于繁忙时间,则会发生内存冲突。有效数量的银行我的意思是这个 - 假设你有8个银行,并且步幅为2个。那么实际上你有4个银行,因为内存访问只能在四个银行排队(例如,假设你的访问都是偶数,从0开始,然后你的访问将在0,2,4,6)银行排列。
事实上,这个公式甚至在下面给出的例子中失败了。 假设我们有8个存储器组,其繁忙时间为6个时钟周期,总存储器延迟为12个时钟周期,完成64元素矢量负载需要多长时间,步长为1? - 这里他们将时间计算为12 + 64 = 76个时钟周期。但是,根据给定的条件会发生存储库冲突,因此我们显然不能在每个周期中进行一次访问(方程式中为64)。
我是错了,还是错误的公式设法在本书的5版本中存活(不太可能)?
答案 0 :(得分:3)
让我们试试这几个不同的步伐,看看我们得到了什么,
银行数量= 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)始终&lt; = 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
为真)错误地预测冲突。