1

2 つのコアがあるとします。それらを core1 と core2 とします。openmp を使用してプログラムを並列化すると、2 つのスレッドが生成されます。openmp の実装で、core1 と core2 ではなく、core1 の 2 つのスレッドの両方を実行するように割り当てることは可能ですか? 最初のケースでは、並列性が失われます。

icc に含まれている Intel openmp を使用しています。デフォルトでは、同じ cpu(コア) で異なるスレッドを実行することは可能ですか?

ありがとう。

4

1 に答える 1

3

使用可能な CPU コアへのスレッドの特定のバインド (または Intel の用語ではピニング) を行うように OpenMP ランタイムに指示することができます。OpenMP 4.0 には、これを抽象的かつ移植可能な方法で指定するための規定が付属していますが、現在の OpenMP 実装では、それを行うための独自のメカニズムが提供されています。

  • KMP_AFFINITYIntel コンパイラについては、こちらを参照してください。
  • GOMP_CPU_AFFINITYGCC (および互換モードの Intel) の場合 -こちらを参照してください。

これらが設定されていない限り、両方のランタイムはデフォルトでバインドなしになり、OS は適切と思われるスレッドを自由にディスパッチできます。たとえば、単一のコアで両方のスレッドをディスパッチする場合があります。後者は、多くの CPU 時間を必要とする他の実行中のプロセスがない限り、ほとんどありません。それでも、ほとんどの OS スケジューラは常にスレッドとプロセスを移行する傾向があるため、最大のパフォーマンスを得るためにバインド メカニズムを使用することをお勧めします。

于 2013-05-25T09:16:04.203 に答える