/ / Kann openmp verschiedene Threads auf derselben CPU (Core) ausführen - c ++, c, openmp

Ist es möglich, dass Openmp verschiedene Threads auf derselben CPU (core) ausführt - c ++, c, openmp

Angenommen, ich habe zwei Kerne. Bezeichnen wir sie als core1 und core2. Wenn ich openmp zum Parallelisieren meines Programms verwende, werden zwei Threads generiert. Ist es möglich, dass die openmp-Implementierung beide Threads auf core1 anstelle von core1 und core2 für die Ausführung freigibt? Im ersten Fall verlieren wir die Parallelität.

Ich verwende Intel openmp, das in icc enthalten ist. Standardmäßig können verschiedene Threads auf derselben CPU (Core) ausgeführt werden.

Vielen Dank.

Antworten:

2 für die Antwort № 1

Es ist möglich, die OpenMP-Laufzeit zu anweisenDie Bindung der Threads an die verfügbaren CPU-Kerne erfolgt spezifisch (oder wird in der Terminologie von Intel festgeschrieben). OpenMP 4.0 enthält Bestimmungen, um dies abstrakt und portabel anzugeben, während die aktuellen OpenMP-Implementierungen ihre eigenen spezifischen Mechanismen dafür bieten:

  • KMP_AFFINITY für Intel-Compiler - siehe Hier;
  • GOMP_CPU_AFFINITY für GCC (und Intel im Kompatibilitätsmodus) - siehe Hier.

Wenn diese nicht festgelegt sind, sind beide Laufzeiten standardmäßig auf Nein gesetztbindend, und das Betriebssystem kann die Threads nach eigenem Ermessen versenden, z. Möglicherweise werden beide Threads auf einem einzelnen Kern verteilt. Letzteres ist eher unwahrscheinlich, es sei denn, es laufen andere Prozesse, die viel CPU-Zeit erfordern. Die meisten OS-Scheduler neigen jedoch dazu, Threads und Prozesse ständig zu migrieren. Daher ist es ratsam, die Bindungsmechanismen für maximale Leistung zu verwenden.