私は、スレッドプールがOpenMP文を含むコードブロックを実行すると考えていました。 (類似:How to deal with OpenMP thread pool contentionと思います)。 OpenMP並列領域が毎回別のスレッドで実行されると、問題が発生したり、パフォーマンスが低下するかどうかという疑問があります。スレッドプールで実行されたOpenMPコード
編集:
ターゲットは、Linux(GCC)およびWindows(MSVC)となります。
最初のプロトタイプが完成した時点でベンチマークを行います(ここで得られる回答の影響を受けます)。今、あなたはTask
のインスタンスは、スレッドプール(スレッド0、...、スレッド-N)にそれを与える作成想像
class Task
{
public:
void doTask()
{
#pragma omp parallel
{
// do work in parallel
}
}
};
:
は、ここで簡単な例です。 1つのスレッドはdoTask()
を実行します。後で同じタスクオブジェクトをスレッドプールに戻します。もう一度、...。 したがってdoTask()
(およびパラレルセクション)は異なるスレッドによって実行されます。私はこれがOpenMPによって効率的に処理されるかどうか疑問に思います(例えば、セクションのスレッドは毎回再作成されません)。
どのコンパイラでですか? –
私の経験でコードを最適化するには、何かがパフォーマンスの向上につながるかどうかを知るための単一の方法があります。何かが遅いかどうかを考え、仮説を作成することは、実装があまりにも複雑な場合にのみ有用です。現実的なテストデモを作成し、それをベンチマークします。 –