8 コアのハードウェアで 8 つ以上のスレッドを同時に実行できるかどうかは疑問です。
もしそうなら、openMP を使用して N 個の計算を並列化すると、たとえば N/8 のサイズのチャンクを作成でき、各スレッドでさらに (N/8)/8 個のスレッドに分岐できます。
並列化を入れ子にするとどうなりますか? 入れ子になった並列に使用できるスレッドはまだ 8 つあるのでしょうか?
ありがとう!!
8 コアのハードウェアで 8 つ以上のスレッドを同時に実行できるかどうかは疑問です。
もしそうなら、openMP を使用して N 個の計算を並列化すると、たとえば N/8 のサイズのチャンクを作成でき、各スレッドでさらに (N/8)/8 個のスレッドに分岐できます。
並列化を入れ子にするとどうなりますか? 入れ子になった並列に使用できるスレッドはまだ 8 つあるのでしょうか?
ありがとう!!
8 コアは、特定の時点で最大 8 スレッドしか同時に実行できません。ただし、スレッドが何をしているかに大きく依存します。CPU を集中的に使用するタスクを実行している場合、コア数よりも多くのスレッドを生成することはお勧めしません (少数でも問題ありません)。そうしないと、過剰なコンテキストの切り替えとキャッシュ ミスにより、パフォーマンスが低下し始めます。ただし、大量の I/O がある場合、CPU を使用せずにスレッドが大量にブロックされる可能性があるため、より多くのスレッドを並行して実行できます。
要するに、特定のケース、特定の環境でのパフォーマンスを測定する必要があるということです。
この関連スレッドも参照してください。
最新の CPU プロセッサには、ハイパースレッディングのオプションがあります。
これは、パイプラインが同時に 2 つ以上のスレッドを実行できることを意味します。
したがって、同時に実行できるスレッドの数は次のようになります:
total_threads = num_procs * hyperthreading factor
通常、ハイパースレッディング係数 = 2 です。
CPU を集中的に使用するワークロードの場合は、total_threads を実行する必要があります。IO 集中型ワークロードの場合、total_threads * 2 スレッドを使用する必要があります。このようにして、一部のスレッドの計算を他のスレッドの io とオーバーラップさせることができます。
これらの経験則は私が従うものです。作業量によって変更する場合があります。
まず、8 つ以上のスレッドを実行することはできません。次に、openmp はこの面で大幅に改善する必要があるため、他に何も機能しない場合は、ネストされた並列処理に頼ります。