Parallel OpenMP loop with break statement
See this snippet:
volatile bool flag=false;#pragma omp parallel for shared(flag)for(int i=0; i<=100000; ++i){ if(flag) continue; if(element[i] ...) { ... flag=true; }}
This situation is more suitable for pthread.
You could try to manually do what the openmp for loop does, using a while loop:
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++; }}
This way you have to test "go" each cycle, but that should not matter that much. More important is that this would correspond to a "static" omp for loop, which is only useful if you can expect all iterations to take a similar amount of time. Otherwise, 3 threads may be already finished while one still has halfway to got...
I would probably do (copied a bit from yyfn)
volatile bool flag=false;for(int j=0; j<=100 && !flag; ++j) { int base = 1000*j; #pragma omp parallel for shared(flag) for(int i = 0; i <= 1000; ++i) { if(flag) continue; if(element[i+base] ...) { .... flag=true; } }}