循环依赖分析:此循环可以并行化吗?

时间:2019-12-12 10:09:39

标签: parallel-processing openmp

我正在为期末考试而学习,我们的教授给了我们一些练习以及答案。可以肯定他的解决方案在这里是错误的...有人可以确认/拒绝吗?

提供的问题:我们可以并行执行以下循环吗?如果是,请执行此操作。如果没有,为什么不呢?

a[0] = 0;
for( i = 1; i < n; i++)
    a[i] = a[i-1] + i;

(教授)提供的答案:是的,如果我们意识到这一点,我们可以做到:

a[0] = 0
a[1] = a[0]+i = i
a[2] = a[1] + i = 2i
a[3] = 3i

(我)我的理由:如果按照输出进行操作,这似乎不成立:

a[0] = 0
a[1] = 0 + 1
a[2] = 1 + 2 = 3
... etc ...

我是正确的,我的教授错了吗?还是我疯了?

2 个答案:

答案 0 :(得分:0)

您的教授可能将'i'与循环外的另一个变量混淆了。

它适用于:

j = ...;
a[0] = 0;
for( i = 1; i < n; i++)
   a[i] = a[i-1] + j;

也就是说,您可以找到a[i]=a[i-1]+i的封闭公式,但是其中涉及的数学更多。在这种情况下,它是:

a[i] = (i^2+i)/2;

通常,它会变得更加复杂,例如斐波那契数列的封闭公式:

https://math.stackexchange.com/questions/65011/how-to-prove-that-the-binet-formula-gives-the-terms-of-the-fibonacci-sequence

答案 1 :(得分:0)

Whomever提供了以下答案:

a[0] = 0
a[1] = a[0]+i = i
a[2] = a[1] + i = 2i
a[3] = 3i

是错误的,因为替换不能那样工作。

所讨论的循环是最简单的示例,可以在其中找到流相关性(也称为“真实”相关性):a[i]始终在读取之前写入,因此存在“写入后读取”的危险”。流相关性强加非对称排序。