バージョン1:OpenMPの、インライン関数、および静的変数(無地C)
inline double func(int i){
double X;
X=sqrt(2)*i;
return X;
}
バージョン2:
inline double func(int i){
static double X;
X=sqrt(2)*i;
return X;
}
バージョン3:
inline double func(int i){
static double X;
#pragma omp threadprivate(X)
X=sqrt(2)*i;
return X;
}
func()
関数は、ですopenmpブロックの内部で呼び出されます:
#pragma omp for default(shared) private(i) schedule(static)
for(i=istart;i<istop;i++){
val[i]=func(i);
}
func()
の中で、最も安全で安全なバージョンは何ですか?すべての3つのバージョンは完璧ですか?
最初に「X」とは何ですか?バージョン2はスレッドセーフではありませんが、 'X'が必要なのかどうかわからなくてもあまり知られていません。 – Gilles
はいバージョン2はスレッドセーフではありません。なぜあなたはそれを静的と宣言していますか?最初のバージョンでは、Xは各スレッドに対してプライベートなので、安全です。最初は見た目は安全だと思われますが、バージョン3はテストする必要があります。 – itsnevertoobadtoaskforhelp
@ Gillesこれは単なる例であり、Xはiに依存する一般的な計算の結果です @itsnevertoobadtoaskforhelp 'func'がループ内にあり、それは時間の零点と呼ばれるので静的と宣言したいと思います。 Xは静的なので、 'func'の各呼び出しで初期化する必要はありません。 – cipper