1

粗いマルチスレッドと細かいマルチスレッドの両方を使用するアプリケーションに取り組んでいます。つまり、スレッドのプールで大きなワーク ユニットのスケジューリングを手動で管理し、それらのワーク ユニット内で、特定の機能が OpenMP を利用してより細かいマルチスレッド化を実現します。

最もコストのかかるループで OpenMP を選択的に使用することで利益を実現しましたが、安価なループに OpenMP ブロックを追加する際に OpenMP ワーカー プールの競合が発生することを懸念しています。コードのブロックが利用可能な場合はプールを使用し、そうでない場合はループをシリアルに処理する必要があることをOpenMPに通知する方法はありますか?

4

2 に答える 2

1

omp_set_num_threads(int)を使用してnoを設定できます。プール内のスレッドの。次に、コンパイラーは、可能であればスレッドのプールを作成し、それらをスケジュールしようとします。プールを作成できない場合は、できるだけ多くのスレッドを作成し、他のスレッドをシリアルに実行します。

詳細については、このリンクをお試しください

于 2011-05-04T06:02:29.433 に答える
0

ディレクティブomp_get_num_threadsで 、omp_set_num_threadsifおよびnum_threads句を巧みに使用することで、必要なことを実行できる場合があります。parallelOpenMP 3.0 はtasks、役に立つかもしれないものも提供します。

于 2010-04-21T22:06:17.197 に答える