OpenMPを使用して並列化しようとしている次のコードがあります。OpenMPを使用したタスクベースの並列処理の適用
int ncip(int dim, double R){
int n, r = (int)floor(R);
if (dim == 1) return 1 + 2*r;
#pragma omp task shared(n, dim)
n = ncip(dim-1, R); // last coord 0
for(int i=1; i<=r; ++i){
#pragma omp task shared(n, dim)
n += 2*ncip(dim-1, sqrt(R*R - i*i)); // last coord +- i
}
return n;
}
再帰呼び出しのためにタスクベースの並列処理を適用する必要がありますが、私の計算ではスピードアップが表示されません。私は間違って何をしていますか?この計算のスピードアップに役立つ提案はありますか?
これについて考え、あなただけの8番目を持っています最も計算量の多い部分は 'sqrt(R * R - i * i)'ですが、その上にマルチスレッド自体(スレッドの作成/同期化)によって引き起こされるオーバーヘッドを追加します。また、 'shared'節の中に変数を入れても、自動的に同時アクセスの点で安全になるわけではありません。 –
@PiotrSkotnickiどうすればいいのですか? –
@PiotrSkotnicki私はこの日の間につかまっています –