我需要帮助理解这个openMP示例

时间:2015-01-26 07:09:36

标签: c++ c multithreading parallel-processing openmp

我从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是私有的而不是共享的?
  • 关于这个答案,如果我有4个线程,所以每个线程执行相同的代码,我不明白我怎样才能获得与顺序代码相同的结果?

线程如何实现这项工作?我需要你的帮助。

2 个答案:

答案 0 :(得分:1)

  

为什么 i是私有的而不是共享的?

变量ij对每个线程都是私有的,因为它们是循环计数器。每个线程必须与其他线程分开跟踪它正在做什么。如果在线程之间共享ij,那么每个线程都会更新它们并混乱执行其他线程。

  

如果我有4个线程,所以每个线程执行相同的代码,我不明白如何获得与顺序代码相同的结果?

每个线程执行相同的代码行,但使用不同的变量。 OpenMP&#39; for&#39;指令有助于在线程之间自动分配迭代,以便每个线程在i循环中获得不同的起始值for和不同的结束值。所以它更像是每个线程在循环中获得相同的代码,但不同的循环初始化和结束条件。所有这些将一起(如果编程正确)给出与顺序实现相同的最终结果。

当然,为了使其工作,循环必须是可并行化的。如果循环的每次迭代都取决于先前迭代计算的结果,那么它就不能并行运行。在这种情况下,您需要重写循环,以便每次迭代都可以独立运行。

答案 1 :(得分:0)

我从不使用omp,但你的问题让我好奇。我希望这份文档可以帮到你。这对我很有帮助。 https://computing.llnl.gov/tutorials/openMP/#Exercise1