私はrun()
という関数を持つプログラムを持っているとします。この関数はfor loop
を実行し、内部でいくつかの処理を行います。OpenMP - パラレルでブロックするための複数の呼び出しを管理する
すべてのCPUコアを利用したいので、OpenMP
と#pragma omp parallel for
を使用して並列化します。
さて、問題は、このrun()
機能は、複数のスレッドから呼び出されていることであると同時に、run()
を呼び出すスレッドの高い数があるときからOpenMP threads
がたくさんあるでしょうから、私は巨大なパフォーマンスの低下を持っています各parallel for
プラグマコール。
A
とスレッド
B
を持っており、私のCPUは4つのコアを有する、ilustrateし、スレッド
A
呼び出しは
for loop
を実行するための4つの
OpenMP
スレッドを作成します
run()
は機能します。
今、同時に、スレッドB
はまた、これが8つのOpenMP
スレッドの合計をもたらす、より4つのOpenMP
スレッドが生成され、run()
呼び出します。上記の例では、OpenMP
でこのバランスをとるためにいくつかの方法があるかどう
私の質問があり、OpenMP
はB
ためA
半の半分のスレッドを使用することができます。 もう1つの戦略はOpenMP
スレッドキューを作成することです。したがって、それ以上のスレッドを使用することはありませんOpenMP
スレッド。
可能なことはありますか?
PS。私の例の2つのスレッドは、私のプログラムでは、スレッドの数が実行時に必要に応じて作成されるため、どれだけのスレッドがrun()
を呼び出しているかは明確ではありません。私はおよそOpenMP
作成されたスレッドを話している時はいつでも、私はOpenMP
スレッドに呼ばれ、私はそれは単にスレッドと呼ばれる他の手段(例えばstd::thread
)によって作成されたスレッドについて話しているときという
PS 2.注意。
あなたが言ったように私の問題は混在したスレッド技術ですが、私は 'currentNumThreads'と' maxNumThreads'を手動で変更するとは思えません。同時に 'run()'を入力する保証はないからです。 私は、 'run()'とは何の関係も持たない別のことをスレッドが持つことができ、 'num_threads()'の計算でカウントされることを意味します。 – Sassa