簡體   English   中英

使用OpenMP和C並行化功能

[英]Parallelizing function using OpenMP and C

我正在嘗試轉換函數“integrate_openMP”,它實現了梯形規則,以便它可以並行運行。 我懷疑函數的哪些部分應該由“關鍵”編譯指示來管理,以及如何處理關於OpenMP的計算本身。

該函數使用pragma的#pragma omp parallel#pragma omp single來自main。

謝謝

我已經初步嘗試並行化該函數更新了代碼

double integrate_openMP(double a, double b, double (*f)(double), double e)
{

  calls++;
  double int_result;
  double m = (a + b) / 2;
  double one_trap_area = (b - a) * (f(a) + f(b)) / 2;
  double two_trap_area = (b - a) * (f(a) + f(b) + 2 * f(m)) / 4;

  if (fabs(one_trap_area - two_trap_area) <= e)
  {
    return two_trap_area;
  }
  else
  {
    double left_area, right_area;
    #pragma omp task shared(left_area)
    {
      left_area = integrate_openMP(a, m, f, e / 2);
    }
    #pragma omp task shared(right_area)
    {
      right_area = integrate_openMP(m, b, f, e / 2);
    }
    #pragma omp taskwait
    int_result = left_area + right_area;

    return int_result;
  }
}


double integrate_single(double a, double b, double (*f) (double), double e) {
  calls ++;
  double m  = (a + b) / 2;
  double one_trap_area = (b - a) * (f(a) + f(b)) / 2;
  double two_trap_area = (b - a) * (f(a) + f(b) + 2 * f(m))/ 4;

  if (fabs(one_trap_area - two_trap_area) <= e) {
    return two_trap_area;
  } else {
    double left_area, right_area;
    left_area  = integrate_single(a, m, f, e/2);
    right_area = integrate_single(m, b, f, e/2);
    return left_area + right_area;
  }
}

問自己一些問題......“這是循環的並行嗎?” 在這種情況下,omp for是有用的。 “這是遞歸並行嗎?” 在這種情況下,請閱讀openmp任務...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM