我试图理解一篇关于检测并行化任务依赖关系的论文,并且我在举一个例子。考虑到A,B,C和D是向量对象:
do I=2,N
S1: A(I) = B(I) + C(I)
S2: D(I) = A(I + 1) + 1
S3: C(I) = D(I)
关注于S1和S2之间的依赖性。对我来说,这是流量依赖性S1-> S2,A在OUT(S1)和IN(S2)中,而A确实在S2中使用,这验证了Woolfe&Banerjee给出的流量依赖性定义。但是,说明指出这是一个反依赖性S2-> S1。是因为我们陷入了循环吗?在那种情况下,这是否意味着在循环中,任何流量相关性都是反向反相关性和相反的关系?
答案 0 :(得分:0)
好吧,最后,它不取决于对象,而是取决于所使用的内存位置。在此示例中,A(I)和A(I + 1)可能不引用相同的内存(如果没有别名)。因此,在当前迭代中它们之间没有依赖关系。但是,如果我们稍微展开循环,则会得到:
do I=2,N
S1: A(I) = B(I) + C(I)
S2: D(I) = -> A(I + 1) + 1
S3: C(I) = D(I)
S1: -> A(I + 1) = B(I + 1) + C(I + 1)
S2: D(I + 1) = A(I + 2) + 1
S3: C(I + 1) = D(I + 1)
现在,反依赖性明显出现了。
现在似乎很明显。