@jeyyykeyyy

Как исправить ошибку invalid controlling predicate?

Непонимаю в чем проблема?

volatile bool flag=false;
    #pragma  omp  parallel  for shared(flag)
    for (int i = 0; x < b; i++)
    {
        if(flag) continue;
        S = S + 4*(x/(x+1));
        x = x + h;
        if (x >= b) flag=true;
        S = S + 2*(x/(x+1));
        x = x + h;
    }
  • Вопрос задан
  • 82 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
OpenMP работает только со стандартными циклами. У вас же инициализация по i, условие по x, итерация i++. OpenMP просто не умеет понять, сколько там итераций и как их можно распаралелить вообще.

Вам надо сделать так:
const int num_iterations=1000000;
const double h = (b-a)/num_iterations/2.0
x = a;
#pragma  omp  parallel  for  reduction (+:S)
for (int i = 0; i < maxi; i++)
{
    S = S + 1*(x/(x+1));
    x = x + h;
    S = S + 4*(x/(x+1));
    x = x + h;
    S = S + 1*(x/(x+1));
}


Удобнее, если зафиксировать сначала количество итераций, а не шаг h (шаг отсюда вычисляется). Потому что если отрезок нацело не делиться на h, то надо как-то это обрабатывать и вообще, а можно ли так считать?

Я добавил reduction (+:S) в инструкцию openMP, потому что вам надо подсчитать общую сумму же. Без этого каждый поток что-то насуммирует отдельно. Шарить S между потоками сложно - может быть data race.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы