Hennessy关于计算机体系结构的书(定量方法5ed)指出,在具有多个内存库的向量体系结构中,如果满足以下条件,就可能发生库冲突(第279页,第5ed):
(银行数目)/LeastCommonMultiple(银行数目,大步)<银行繁忙时间
但是,我认为应该是GreatestCommonFactor,而不是LCM,因为如果有效银行的数量少于繁忙时间,那么内存冲突就会发生。我指的是银行的有效数量--假设你有8家银行,大步2。那么实际上你有4家银行,因为内存访问将只在四家银行排队(例如,假设您的访问权限都是偶数,从0开始,那么您的访问将在0、2、4、6银行排队)。
事实上,这个公式对于下面给出的例子甚至是失败的。假设我们有8个内存组,繁忙时间为6个时钟周期,总内存延迟为12个时钟周期,那么完成一个步幅为1的64元素向量负载需要多长时间?这里,它们将时间计算为12+64=76时钟周期。但是,内存库冲突将根据给定的条件发生,因此我们显然不能每个周期(等式中的64次)访问一次。
是我弄错了,还是错误的公式成功地熬过了这本书的5版(不太可能)?
发布于 2016-11-13 20:13:28
GCD(银行,大步)应该进入它;你的论点是正确的。
让我们尝试一下这几个不同的步骤,看看我们得到了什么,对于银行的数量= 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 8b/LCM(s,b)总是<=1,所以它总是预测冲突。
我认为GCF (又名GCD)对于我到目前为止所看到的步幅值来说是正确的。只有当步长不将访问分配到所有银行时,您才会遇到问题,而b/GCF(s,b)就是这样告诉您的。
大步=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为真)不正确地预测冲突。
https://stackoverflow.com/questions/40576312
复制相似问题