Parallel OpenMP loop with break statement Parallel OpenMP loop with break statement multithreading multithreading

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;      }   }}