私は、以下の回路図を持つ計算コードを書いています。
#pragma omp parallel
{
#pragma omp for nowait
// Compute elements of some array A[i] in parallel
#pragma omp single
for (i = 0; i < N; ++i) {
// Do some operation with A[i].
// This time it is important that operations are sequential. e.g.:
result = compute_new_result(result, A[i]);
}
}
コンピューティングA[i]
とどちらcompute_new_result
もかなり高価です。したがって、私の考えは、配列要素を並列に計算し、いずれかのスレッドが解放されると、順次操作を開始することです。開始配列要素がすでに計算されている可能性が高く、他の要素はまだ最初のループを実行している他のスレッドによって提供されます。
ただし、コンセプトを機能させるには、次の 2 つのことを達成する必要があります。
OpenMP が別の方法でループを分割するようにするには、つまり 2 つのスレッドに対して: 、 を計算するスレッド 1 、およびA[0]
、を計算するスレッド 2: 、、など。A[2]
A[4]
A[1]
A[3]
A[5]
信号システムを提供するため。
A[i]
すでに計算されていることを示すフラグの配列について考えています。次に、続行する前にcompute_new_result
、それぞれのフラグが解放されるのを待つ必要があります。A[i]
両方の目標を達成するためのヒントをいただければ幸いです。Linux、Windows、Mac 間で移植できるソリューションが必要です。コード全体を C++11 で書いています。
編集:
私は最初の質問に対する答えを見つけました。ディレクティブにschedule(static,1)
句を追加するだけで十分なようです。#pragma omp for
ただし、2番目の問題のエレガントな解決策についてはまだ考えています...