2016-04-30 21 views
1

I recently learnedオブジェクトのメソッドを評価関数に渡し、このメソッドを呼び出すときにループでOpenMPを使用したいと思います。実際のコードは次のとおりです。メソッドへのポインタを使用してOpenMPを使用して、

wfnは、分子の「波動関数」を表し、物理学を表現するために保存され、多くの、多くのプライベート変数を持っている
std::vector< std::vector<double> > grid2D(wfn& W, double (wfn::*p)(double, double, double), std::vector<double> xs, std::vector<double> ys, double z) { 
    std::vector< std::vector<double> > fs; 
    int nx = (int)xs.size(); 
    int ny = (int)ys.size(); 

    fs.resize(nx); 
    for(int ix = 0; ix < nx; ix++) { 
     fs[ix].resize(ny); 
     for(int iy = 0; iy < ny; iy++) { 
      fs[ix][iy] = (W.*p)(xs[ix], ys[iy], z); 
     } 
    } 

    return fs; 
} 

iyのループの上に#pragma omp parallel forを挿入すると、グリッドの生成が​​になります。この#pragmaにプライベートとしてW.*pを渡す方法がありますので、pの評価はスレッドセーフですか?

+1

pは 'const'メソッドですか? 'const'として' W'を渡すことができますか?もしそうでなければ、 'p'の' W'の状態はどうなりますか? – Zulan

答えて

0

2番目のforループの前に挿入する正確な#pragma ompステートメントについて詳しくは説明しません。私はあなたが任意の変数をプライベート宣言しないと仮定しているので、ループ内のすべての変数は共有されていると見なされます。これにより、スレッドは予測不可能な方法でデータを変更します。ステートメントにprivate(list_of_variables)を追加することで、変数をプライベートに宣言できます。まず、「デフォルト(なし)」(#)を#pragma ompステートメントに追加し、すべての変数をプライベートとして宣言します。次に、リストから1つずつ変数を削除し、それらを共有することを宣言することができます。もちろん、それぞれの修正の後、再コンパイルしてコードを再実行する必要があります。場合によっては、このプロセスに時間がかかることがあります。だから、あなたが使用しているOMPのバージョンによっては、デフォルト(なし)プライベート(W、XS、YS、IY、FS、z)はFIRSTPRIVATE(IX)

ため

の#pragma ompの平行で始めることができますループ変数iyはデフォルトではプライベートであるかもしれません。

関連する問題