OpenMP问题

Tim*_*Tim 1 c++ class openmp

我想在类成员函数中并行化循环.但是代码中有两个错误:

class myclass  
{  
public:  

int _k;  

void f(int nb_examples, int nb_try)  
{  
      int i;  
      int ks[nb_try];  
      // assignment to elements in ks  
      omp_set_num_threads(_nb_threads);  
    #pragma omp parallel shared(ks) private(i, _k) // error: ‘myclass::_k’ is not a variable in clause ‘private’  
      {  
    #pragma omp for schedule(dynamic) nowait  
        for(i=0; i < nb_try; i ++){  
          _k = ks[i];  
          if (_k > nb_examples)  break;// error: break statement used with OpenMP for loop  
          // operations on _k  
        }  
      }   
}  
}
Run Code Online (Sandbox Code Playgroud)

如何解释这些错误并解决问题?感谢致敬!

小智 6

对于第二个错误,由于并行性质,OpenMP规范不允许您中断并行for循环或抛出异常.相反,请参阅此博客上的解决方案解决方案:http://www.thinkingparallel.com/2007/06/29/breaking-out-of-loops-in-openmp/

对于第一个错误,我花了一些时间来挖掘实际发生的事情 - 我认为这解释了它:

私有变量不能具有引用类型,因为它将导致并发共享内存访问.虽然变量将是私有的,但变量仍将处理相同的内存片段.声明为private的类实例必须具有显式的复制构造函数,否则包含引用的实例将被错误地复制.

来自http://www.viva64.com/content/articles/parallel-programming/?f=32_OpenMP_traps.html&lang=en&content=parallel-programming

基本上我不认为你可以使用类级变量作为私有变量而不复制它们.你有什么理由不能在函数范围内使用变量吗?