我想在类成员函数中并行化循环.但是代码中有两个错误:
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的类实例必须具有显式的复制构造函数,否则包含引用的实例将被错误地复制.
基本上我不认为你可以使用类级变量作为私有变量而不复制它们.你有什么理由不能在函数范围内使用变量吗?