1

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

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

如何解释这些错误并解决问题?谢谢并恭祝安康!

4

1 回答 1

6

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

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

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

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

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

于 2010-01-31T22:13:53.823 回答