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.