いくつかの配列のプレフィックス(例out_arr[0]
= in_arr[0]
、out_arr[1]
= in_arr[0]+in_arr[1]
.. など)の合計を並行して計算するコードがあります。私のコードにはN
スレッドがN
あり、多数のin_arr
要素があり、各スレッドは配列の 1 つの要素のみを処理します。これは良い解決策ではないので、各スレッドで処理したいのですがN/num_of_threads
、失敗しました。
値を持つ共有変数を作成し、最初のディレクティブの後ろにあるこの変数を使用してサイクルをN/num_of_threads
編成しようとしましたが、stdout でそれらのマジック ナンバーをデバッグできませんでした。for
#pragma
これは、«bad» ソリューションの動作バージョンです。
void CalcSum2(int a[], int s[], int n) {
int* old = new int [n], *cnt = new int [n];
#pragma omp parallel num_threads(N) {
int i = omp_get_thread_num(), d = 1;
s[i] = a[i];
cnt[i] = 1;
#pragma omp barrier
while (d < n) {
old[i] = s[i];
#pragma omp barrier
if (i >= d) {
s[i] += old[i-d];
cnt[i]++;
}
d += d;
#pragma omp barrier
}
}
delete[] old; delete[] cnt;
return;
}