【问题标题】:beginner question: openMP for a loop that uses its own data初学者问题:openMP 用于使用自己的数据的循环
【发布时间】:2025-11-25 09:20:06
【问题描述】:

抱歉,如果标题描述不准确!我是 OMP 的新手,并试图使这个循环并行。我在关键、原子和锁方面苦苦挣扎,但无法让它发挥作用。 b 是一个大小为 n 的双精度数组。

结果和我去掉omp代码时不一样

我的真实代码比较复杂,但如果我能理解 OMP 在这方面的使用,那将是一个很大的帮助

#pragma omp parallel
 for(int i = 0; i < n; i++) 
 {
    double v = 0;
     
    #pragma omp critical
    for (int j=i-1; j <= i+1; j++)
       if (j >= 0 && j < n)
           v += b[j];
   
    b[i] = somecalculation(v);
 }

【问题讨论】:

  • 您确定这是您希望使用的正确算法吗?您可能打算使用以下内容:bnew[i]=somecalculation(v); 在循环后将bnew 数组复制回b。如果是这样,它可以很容易地并行化。

标签: loops openmp


【解决方案1】:

对不起,我确实有。将临界扩展包括 b[i] 的计算我得到了同样的错误结果。我猜你是对的,不是可解释的,我只是希望有一些技巧!

#pragma omp parallel for
 for(int i = 0; i < n; i++) 
 {
    double v = 0;
     
    #pragma omp critical
   {
     for (int j=i-1; j <= i+1; j++)
       if (j >= 0 && j < n)
           v += b[j];
   
     b[i] = somecalculation(v);
   }
 }

【讨论】:

  • 你应该把它写成评论而不是新的答案......
【解决方案2】:

这里有两个问题:

  1. 您使用#pragma omp parallel,但看起来您想要#pragma omp parallel for。你写它的方式,每个线程都执行循环的每次迭代,实际上是多次计算所有内容

  2. 您的关键部分在循环之后结束。它不包括b[i] 的更新。但是i+1的计算取决于i的结果

如何解决这个问题:我认为你不能。代码似乎无法以任何有意义的方式并行化,因为每次迭代都取决于最后一次的结果。

【讨论】: