私のコードでは、さまざまな配列を変更するさまざまな関数があり、関数の呼び出し順序が重要です。すべての関数が大きな回数呼び出されると、スレッドを作成して破壊することが大きなオーバーヘッドになっています。 自分の現在の問題を単純化しすぎている可能性があるため、私の質問に編集してください。 funcA、funcBのとFUNC Cはスレッド作成時のオーバーヘッドを避けるopenMP
void funcA (int* a, point b, int* c){
#pragma omp parallel for shared(a,b,c)
for (int ii = 0; ii < b.y; ii++){
for (int jj = 0; jj < b.x; jj++){
\\ alter values of a and c
}
}
}
void funcB (int* a, point b, int* c){
#pragma omp parallel for shared(a,b,c)
for (int ii = 0; ii < b.y; ii++){
for (int jj = 0; jj < b.x; jj++){
\\ alter values of a and c
}
}
}
double funcC (int* a, pointb, int* c){
double k = 0;
#pragma omp parallel for shared(a,b,c) reduction(+:k)
for (int ii = 0; ii < b.y; ii++){
for (int jj = 0; jj < b.x; jj++){
\\ alter values of a and c
k += sqrt(a[ii*jj] + c[ii**jj]);
}
}
return k;
}
ある 例
double ans = 0;
for (int i = 0; i < 4000; i++){
funcA(a,b,c);
funcB(a,b,c);
ans = funcC(a,b,c):
}
prinft(ans);
すべての機能で使用され、常にではありませんされているループの最初の前に、スレッドのチームを作成するためにどのような方法があります破壊され、再び作成され、関数呼び出しで正しい順序を維持しますか?
EDIT 2:
私が探しています何がその順序でてfuncA funB、funcCを実行する方法です。しかし、関数には複数のスレッドを使用するいくつかのコードがあります。私は最初にスレッドを作成する方法が欲しいし、それらのパラレルセクションでのみ使用されるので、最後の答えが正しい。フォークを避け、40000回参加する方法はありますか?
[gcc openmp thread reuse] /stackoverflow.com/questions/9076472/gcc-openmp-thread-reuse) – Zulan
ここで 'k'は何をしていますか?それを合理的に賢明な使用なしで、それを扱う方法を説明することは難しいです... – Gilles
@ギル私は私の質問をよりよく説明するために編集しました – Carlos