带有break语句的并行OpenMP循环

Jea*_*nno 22 c++ multithreading loops openmp

我知道你不能有一个OpenMP循环的break语句,但我想知道是否有任何解决方法,同时仍然受益于并行性.基本上我有'for'循环,循环遍历大向量的元素,寻找满足某个条件的一个元素.但是只有一个元素可以满足条件,所以一旦发现我们可以突破循环,提前谢谢

for(int i = 0; i <= 100000; ++i)
  {
    if(element[i] ...)
     {
          ....
          break;
      }
   }
Run Code Online (Sandbox Code Playgroud)

小智 23

看到这个片段:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这种情况更适合pthread.


Haa*_*hii 8

您可以尝试使用while循环手动执行openmp for循环:

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++;
    }
}
Run Code Online (Sandbox Code Playgroud)

这样你就必须在每个周期测试"走",但这不应该那么重要.更重要的是,这将对应于循环的"静态"omp,这仅在您可以预期所有迭代花费相似的时间量时才有用.否则,3个线程可能已经完成,而其中一个仍然有一半...