いくつかの配列のプレフィックス(例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;
}