Wie steuern Sie die Thread-Affinität über mehrere Prozesse unter Linux hinweg?

827
Derek Rodriguez

Frage

Wie führe ich zwei Benchmarks durch:

  • Sie werden beide gleichzeitig ausgeführt
  • Beide Benchmarks haben die Hälfte ihrer Gewinde an jedem Sockel.
  • Keine zwei Threads haben den gleichen Kern.

Hintergrund

Ich habe zwei Programme: einen Benchmark-Fortran und einen Benchmarker in C. Beide implementieren die OpenMP-Bibliothek und sind darauf eingestellt.

Ich versuche derzeit, die Threads beider Prozesse auf mehrere Sockets zu verteilen, während verhindert wird, dass zwei Threads denselben Kern gemeinsam nutzen müssen. OpenMP ermöglicht, dass Threads mithilfe der OMP_PROC_BIND=spreadUmgebungsvariablen gleichmäßig auf mehrere Sockets verteilt werden. Wenn Sie jedoch beide Programme gleichzeitig ausführen, erhalten beide Benchmarks die gleichen Kerne.

Ich führe diese Benchmarks auf einem Server aus, der über zwei 12-Kern-Haswell-E-CPUs verfügt, und ich habe die Benchmarks für das Erstellen von 12 Threads pro Stück festgelegt, so dass es keinen Mangel an Kernen gibt. Ich lasse gerade CentOS 7.3.1611 laufen.

Randnotiz

Mir ist bewusst, dass dies eine merkwürdige Konfiguration ist, sie ist jedoch für die Leistungsanalyse erforderlich. Vielen Dank im Voraus allen, die sich zu diesem Thema geäußert haben.

0

1 Antwort auf die Frage

0
Astara

Erstens: Holen Sie Ihr CPU-Layout von / proc / cpuinfo, das ungefähr so ​​aussieht (dies ist auf einem 2-Sockel, 6-Kern, die Liste ist abgeschnitten):

> cat /proc/cpuinfo |grep -P 'processor|physical id|core id' processor : 0 physical id : 1 core id : 0 processor : 1 physical id : 0 core id : 0 processor : 2 physical id : 1 core id : 1 processor : 3 physical id : 0 core id : 1 

Physical-ID wird Ihr Sockel sein. Beachten Sie in meinem Fall, dass die Core-ID zwischen Sockeln wechselt.

Verwenden Sie 'schedtool', um die Affinität einer Gruppe auf eine physische ID festzulegen. In meinem Fall würde ich also, da die Gleichen und die Chancen auf separaten physischen CPU (Sockets) liegen, Folgendes verwenden:

schedtool -a 0,2,4,6,8,10 -e run_group1 & schedtool -a 1,3,5,7,9,11 -e run_group2 & 

Dabei startet run_group1 alle Threads, die Sie auf einem Core möchten, und run_group2 startet die anderen. (Sehen Sie sich 'man schedtool' an (weitere Optionen finden Sie in Abschnitt 8. Ich habe beide in den Hintergrund gestellt, sodass beide Gruppen gleichzeitig laufen sollten.)

Möglicherweise müssen Sie root sein, um die Affinität festzulegen - nicht sicher.

Kann das Ihr Q lösen oder habe ich etwas falsch verstanden?

Ich schätze den Vorschlag! Ich werde es morgen versuchen. Aus irgendeinem Grund konnte RPM keine Schedtools in der Datenbank finden. Dies ist jedoch wahrscheinlich ein Problem, das in einem anderen Beitrag behoben wurde. Derek Rodriguez vor 7 Jahren 0
Es hat perfekt funktioniert! Vielen Dank. Derek Rodriguez vor 7 Jahren 0