Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 循环依赖性分析:这个循环可以并行化吗?_Parallel Processing_Openmp - Fatal编程技术网

Parallel processing 循环依赖性分析:这个循环可以并行化吗?

Parallel processing 循环依赖性分析:这个循环可以并行化吗?,parallel-processing,openmp,Parallel Processing,Openmp,我正在准备期末考试,教授给了我们一些练习题和练习题的答案。很确定他的解决方案是错误的。。。有人能证实/否认吗 提供的问题:我们可以并行化以下循环吗?如果是,就去做。若否,原因为何 a[0] = 0; for( i = 1; i < n; i++) a[i] = a[i-1] + i; (我)我的理由是:如果你遵循输出,这似乎不成立: a[0] = 0 a[1] = 0 + 1 a[2] = 1 + 2 = 3 ... etc ... 我的教授错了,我是对的吗?还是我疯了?你的教

我正在准备期末考试,教授给了我们一些练习题和练习题的答案。很确定他的解决方案是错误的。。。有人能证实/否认吗

提供的问题:我们可以并行化以下循环吗?如果是,就去做。若否,原因为何

a[0] = 0;
for( i = 1; i < n; i++)
    a[i] = a[i-1] + i;
(我)我的理由是:如果你遵循输出,这似乎不成立:

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

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

你的教授可能把“I”和循环外的另一个变量混淆了

这将有助于:

j = ...;
a[0] = 0;
for( i = 1; i < n; i++)
   a[i] = a[i-1] + j;
一般来说,它可能会变得更复杂,比如斐波那契级数的闭合公式:


谁提供了这个答案:

a[0] = 0
a[1] = a[0]+i = i
a[2] = a[1] + i = 2i
a[3] = 3i
这是错误的,因为替代不是这样的


所讨论的循环是可以定位流依赖项(也称为“真”依赖项)的最简单示例:
a[i]
总是在读取之前写入,因此存在“先读后写”的危险。流依赖关系会造成不对称排序。

您是对的,提供的答案不正确。(很抱歉刚才的评论,我把你的答案和教授们弄混了。)事实上,你的教授是对的。这就是为什么这是一个很好的考试题目——在实际情况下是完全荒谬的。当并行线程数等于n时,我将保持所有线程的初始值(i=1)。这就是他所说的:a[3]=3i,但是,要在a[i-1]使用锁(或其他控制机制)时具有预期值,这使得整个问题变得荒谬。我将此作为评论发布,因为我不知道openmp是什么。catch可以以特定的方式在该语言中循环,如[C++中的每一个]都是完全不同的。是由您或您的教授提供的“提供的答案”吗?当您认识到循环可以重写时,<代码> > [i] <代码>是正确的公式:<代码> i*(i + 1)/2 < /代码>。是的,这样写,循环可以并行化。“提供的答案”是我的教授,我编辑了它以使它现在更清楚。。。等等,对不起,是哪一个?在这里得到相互矛盾的答案
a[i] = (i^2+i)/2;
a[0] = 0
a[1] = a[0]+i = i
a[2] = a[1] + i = 2i
a[3] = 3i