1

クラスメンバー関数のループを並列化したい。ただし、コードには2つのエラーがあります。

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

2番目のエラーの場合、OpenMP仕様では、並列の性質のため、並列forループから抜け出したり、例外をスローしたりすることはできません。代わりに、このブログの回避策を参照してください:http ://www.thinkingparallel.com/2007/06/29/breaking-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 に答える