Вы можете попытаться вручную сделать то, что делает цикл openmp for, используя цикл while:
const int N = 100000;
std::atomic<bool> go(true);
uint give = 0;
#pragma omp parallel
{
uint i, stop;
#pragma omp critical
{
i = give;
give += N/omp_get_num_threads();
stop = give;
if(omp_get_thread_num() == omp_get_num_threads()-1)
stop = N;
}
while(i < stop && go)
{
...
if(element[i]...)
{
go = false;
}
i++;
}
}
Таким образом, вы должны тестировать "go" каждый цикл, но это не должно иметь большого значения.Более важно то, что это будет соответствовать «статическому» циклу omp for, что полезно только в том случае, если вы можете ожидать, что все итерации займут одинаковое количество времени.В противном случае, 3 потока могут быть уже закончены, а один еще на полпути к получению ...