私は OpenMP にかなり慣れていないので、これは簡単な答えかもしれませんが、見つけることができませんでした。
次の C コードがあり、OpenMP を使用して並列化したいとします。A は、1 未満の double 値を持つオブジェクトの配列であり、バケットはリンクされたリストの配列であり、append はオブジェクトへのポインターをリンクされたリストの末尾に追加します。
#pragma omp for
for (i = 0; i < n; ++i) {
x = (int) (A[i].val * NUM_BUCKETS);
append(&A[i], buckets[x]);
}
問題は、複数のスレッドが一度に特定のバケットにアイテムを追加しようとする可能性があることです。その追加ステートメントをクリティカルにすることができます。ただし、私のアプリケーションでは、おそらく 1000 個程度のバケットを使用することになるため、ほとんどの場合、スレッドは異なるバケットで動作します。
バケットの個々の要素にロックを適用する方法はありますか? または、これを処理する他の方法はありますか?