8つ以上のスレッドが8つのコアを持つハードウェアで同時に実行できるかどうか疑問です。マルチスレッド(openMP) - 並列スレッドの数
N個の計算を並列化するためにopenMPを使用すると、N/8などのサイズのチャンクを作成することができ、各スレッドでさらに(N/8)/ 8スレッドに分岐します。
並列化をネストしたときにどうなるのですか?入れ子にされた並列にはまだ8つのスレッドがありますか?
ありがとうございます!
8つ以上のスレッドが8つのコアを持つハードウェアで同時に実行できるかどうか疑問です。マルチスレッド(openMP) - 並列スレッドの数
N個の計算を並列化するためにopenMPを使用すると、N/8などのサイズのチャンクを作成することができ、各スレッドでさらに(N/8)/ 8スレッドに分岐します。
並列化をネストしたときにどうなるのですか?入れ子にされた並列にはまだ8つのスレッドがありますか?
ありがとうございます!
8つのコアは、特定の時点で同時に最大8つのスレッドしか実行できません。しかし、多くはあなたのスレッドが何をしているかによって異なります。 CPU集約的な作業を行っている場合は、コアの数より多くのスレッドを生成することは推奨されません(多分OKかもしれません)。そうしないと、過剰なコンテキスト切り替えやキャッシュミスがパフォーマンスを低下させます。しかし、重要なI/Oがある場合、CPUを使用せずにスレッドが多くブロックされる可能性があるため、より多くのスレッドを並列に実行できます。
要するに、特定の環境、特定の環境でのパフォーマンスを測定する必要があります。
this related threadも参照してください。
まず、8つ以上のスレッドを実行することはできません。 第2に、openmpがこの面で多くを改善しなければならないので、何も動作しなければ入れ子にされた並列処理に頼ります。
最新のCPUプロセッサには、ハイパースレッディングのオプションがあります。
これは、パイプラインが2つ以上のスレッドを同時に実行できることを意味します。
だから同時に実行できるスレッドの数は次のとおりです。
total_threads =のnum_procs *ハイパースレッディング・ファクタ一般
、CPUを集中ワークロードのために= 2.
ハイパースレッディング・ファクタ、あなたが実行する必要がありますtotal_threads。 集中的なワークロードの場合は、total_threads * 2スレッドを使用する必要があります。このようにして、あるスレッドの計算を他のスレッドのioとオーバーラップさせることができます。
これらの親指のルールは私が従うものです。作業負荷に応じて変更することができます。
私はインタリーブが特定のシナリオで起こる可能性があると考えていますか?たとえば、特定のプロセスが完了するのを待っている場合は、 – ScarletAmaranth
私のプログラムはネストされた並列を使う方が高速です(20%?)。私は使用するスレッドの数を強制することはありません、私はomp_set_nested(true)を設定します – octoback
@ScarletAmaranth、はい、確かに。 I/Oはこれの最も典型的な例です(私は私の答えでそれを言及しました)が、他の場合もあります。 –