我从openMP开始,我希望并行化这部分代码:
for (i=0 ;i<n ;i++)
for (j=1 ;j<n ;j++)
A[i][j]+=A[i][j-1];
我找到了这个答案:
#pragma omp parallel for private(i, j) shared(A, n)
for (i = 0; i < n; ++i)
for (j = 1; j < n; ++j)
A[i][j] += A[i][j-1];
我有一些问题:
i
是私有的而不是共享的? 线程如何实现这项工作?我需要你的帮助。
答案 0 :(得分:1)
为什么
i
是私有的而不是共享的?
变量i
和j
对每个线程都是私有的,因为它们是循环计数器。每个线程必须与其他线程分开跟踪它正在做什么。如果在线程之间共享i
或j
,那么每个线程都会更新它们并混乱执行其他线程。
如果我有4个线程,所以每个线程执行相同的代码,我不明白如何获得与顺序代码相同的结果?
每个线程执行相同的代码行,但使用不同的变量。 OpenMP&#39; for&#39;指令有助于在线程之间自动分配迭代,以便每个线程在i
循环中获得不同的起始值for
和不同的结束值。所以它更像是每个线程在循环中获得相同的代码,但不同的循环初始化和结束条件。所有这些将一起(如果编程正确)给出与顺序实现相同的最终结果。
当然,为了使其工作,循环必须是可并行化的。如果循环的每次迭代都取决于先前迭代计算的结果,那么它就不能并行运行。在这种情况下,您需要重写循环,以便每次迭代都可以独立运行。
答案 1 :(得分:0)
我从不使用omp,但你的问题让我好奇。我希望这份文档可以帮到你。这对我很有帮助。 https://computing.llnl.gov/tutorials/openMP/#Exercise1