5

8つ以上のスレッドが8つのコアを持つハードウェアで同時に実行できるかどうか疑問です。マルチスレッド(openMP) - 並列スレッドの数

N個の計算を並列化するためにopenMPを使用すると、N/8などのサイズのチャンクを作成することができ、各スレッドでさらに(N/8)/ 8スレッドに分岐します。

並列化をネストしたときにどうなるのですか?入れ子にされた並列にはまだ8つのスレッドがありますか?

ありがとうございます!

答えて

10

8つのコアは、特定の時点で同時に最大8つのスレッドしか実行できません。しかし、多くはあなたのスレッドが何をしているかによって異なります。 CPU集約的な作業を行っている場合は、コアの数より多くのスレッドを生成することは推奨されません(多分OKかもしれません)。そうしないと、過剰なコンテキスト切り替えやキャッシュミスがパフォーマンスを低下させます。しかし、重要なI/Oがある場合、CPUを使用せずにスレッドが多くブロックされる可能性があるため、より多くのスレッドを並列に実行できます。

要するに、特定の環境、特定の環境でのパフォーマンスを測定する必要があります。

this related threadも参照してください。

+0

私はインタリーブが特定のシナリオで起こる可能性があると考えていますか?たとえば、特定のプロセスが完了するのを待っている場合は、 – ScarletAmaranth

+0

私のプログラムはネストされた並列を使う方が高速です(20%?)。私は使用するスレッドの数を強制することはありません、私はomp_set_nested(true)を設定します – octoback

+0

@ScarletAmaranth、はい、確かに。 I/Oはこれの最も典型的な例です(私は私の答えでそれを言及しました)が、他の場合もあります。 –

0

まず、8つ以上のスレッドを実行することはできません。 第2に、openmpがこの面で多くを改善しなければならないので、何も動作しなければ入れ子にされた並列処理に頼ります。

1

最新のCPUプロセッサには、ハイパースレッディングのオプションがあります。
これは、パイプラインが2つ以上のスレッドを同時に実行できることを意味します。

だから同時に実行できるスレッドの数は次のとおりです。
total_threads =のnum_procs *ハイパースレッディング・ファクタ一般

、CPUを集中ワークロードのために= 2.

ハイパースレッディング・ファクタ、あなたが実行する必要がありますtotal_threads。 集中的なワークロードの場合は、total_threads * 2スレッドを使用する必要があります。このようにして、あるスレッドの計算を他のスレッドのioとオーバーラップさせることができます。

これらの親指のルールは私が従うものです。作業負荷に応じて変更することができます。

関連する問題