【问题标题】:How to do a parallel bilinear interpolation如何进行并行双线性插值
【发布时间】:2021-04-12 04:56:15
【问题描述】:

我试过这个但我不知道它是否正确,并且计算执行时间有时它会给我 0 在代码中。

我首先创建了一个结构来存储要插值的点的所有坐标我有一个要插值的点表,所以我使用pragma parallel for 执行 for 部分来插值所有点。变量 R1、R2 和 P 是双精度变量,并且在线程之间共享。

  #pragma omp parallel for
  for(i=0;i<N ; i++)
  {
     R1 =  BilinearInterpolation(Table[i].x1, Table[i].Q11,Table[i].x2, Table[i].Q21,Table[i].x);
     R2 =  BilinearInterpolation(Table[i].x1, Table[i].Q12, Table[i].x2, Table[i].Q22,Table[i].x);
     P =  BilinearInterpolation(Table[i].y1,  R1, Table[i].y2,  R2, Table[i].y);
     TableInter[i] = P;
  }

【问题讨论】:

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


    【解决方案1】:
     #pragma omp parallel for
     for(i=0;i<N ; i++)
     {
          R1 = BilinearInterpolation(Table[i].x1, Table[i].Q11,Table[i].x2, Table[i].Q21,Table[i].x);
          R2 = BilinearInterpolation(Table[i].x1, Table[i].Q12, Table[i].x2, Table[i].Q22,Table[i].x);
          P =  BilinearInterpolation(Table[i].y1,  R1, Table[i].y2,  R2, Table[i].y);
          TableInter[i] = P;
     }
    

    您的代码的问题是R1R2P 由多个线程共享和更新,因此您有一个竞态条件。例如,一个线程可能正在更改P,而另一个线程将P 添加到TableInter[i]。尽管如此,您可以通过将这些变量声明为 privateie、 在并行区域内声明它们或使用OpenMP 的 private 子句 (#pragma omp parallel for private(R1, R2, P)。

     #pragma omp parallel for private(R1, R2)
     for(i=0;i<N ; i++)
     {
          R1 = BilinearInterpolation(Table[i].x1, Table[i].Q11,Table[i].x2, Table[i].Q21,Table[i].x);
          R2 = BilinearInterpolation(Table[i].x1, Table[i].Q12, Table[i].x2, Table[i].Q22,Table[i].x);
          TableInter[i] = BilinearInterpolation(Table[i].y1,  R1, Table[i].y2,  R2, Table[i].y);
     }
    

    只要BilinearInterpolation 方法不修改线程间的共享状态,这段代码就没有竞争条件。

    计算执行时间有时它在代码中给我 0,

    计算时间可以使用OpenMP函数omp_get_wtime,如下:

    double start = omp_get_wtime();
    // the code that you want to measure.
    double end = omp_get_wtime();  
    printf("%f\n",end-start);
    

    【讨论】:

      猜你喜欢
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-29
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多