Распараллеливание функции с использованием OpenMP и C - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь преобразовать функцию "integrate_openMP", которая реализует правило трапеции, чтобы она могла выполняться параллельно.У меня есть сомнения относительно того, какие части функции должны регулироваться прагмой «Критические» и как иметь дело с самими вычислениями в отношении OpenMP.

Функция вызывается с # pragma omp параллельной и # 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;
  }
}

1 Ответ

0 голосов
/ 30 апреля 2019

Задайте себе несколько вопросов ... "Является ли этот цикл параллелизмом?"в этом случае omp для полезен."Это рекурсивный параллелизм?"в этом случае прочитайте подробности о задачах openmp ...

...