2013-02-06 2 views
6

Ich benutzte das numactl mit der Option --physcpubind. Handbuch sagt:numactl --physcpubind

--physcpubind=cpus, -C cpus 
Only execute process on cpus. Etc... 

Sagen wir, ich NUMA-System mit 3 NUMA-Knoten haben, wobei jeder von ihnen vier Kerne hat. NUMA-Knoten 0 hat 0, 1, 2, 3 als Kernnummern. NUMA Knoten 1 hat 4,5,6,7, und NUMA Knoten 2 hat 8,9,10,11. Meine Frage ist, lassen Sie uns sagen, dass ich das Programm ausführen wie folgt:

export OMP_NUM_THREADS=6 
numactl --physcpubind=0,1,4,5,8,9 ./program 

also werde ich mein Programm mit 6 Threads ausgeführt werden, und Ich wünsche ihnen 0,1,4,5,8 auf CPU-Kerne zu sein, 9. Zum Beispiel, wenn zu einem bestimmten Zeitpunkt während des Programms Threads 0-5 CPU-Kerne 0, 1, 4, 5, 8, 9 (Setup1) zugeordnet sind. Ist es möglich, dass zu einem anderen Zeitpunkt während der Programmausführung Thread 0 auf dem CPU-Kern 9 läuft und so weiter? I.e. Wird es eine Thread-Migration zwischen CPU-Kernen geben? Oder die Threads werden eindeutig an CPU-Kerne gebunden (wie in Setup1)? Vielen Dank.

+0

physcpubind sollte eine Schnittstelle zu [sched_setaffinity] (http://linux.die.net/man/2/sched_setaffinity) sein, so dass es cpuset des Prozesses und aller Threads ändert. Jeder Thread darf auf einer beliebigen CPU von dem CPU-Satz laufen, die Migration ist zwischen jeder CPU aus dem CPU-Satz erlaubt. Wenn Sie Threads an CPUs binden möchten, verwenden Sie sched_setaffinity oder pthread_setaffinity_np direkt in jedem Thread. Oder legen Sie die Affinität über die OMP-Bibliothek fest: http://StackOverflow.com/a/8325730/196561, z. mit dem Befehl 'export OMP_PROC_BIND = true'. – osgx

+0

@osgx Danke. Kannst du diese Frage beantworten? Vielen Dank. – tiki

Antwort

5

physcpubind Möglichkeit numactl sollte eine Schnittstelle zu sched_setaffinity Systemaufruf sein, die zum Zeitpunkt des Prozessausgangs cpuset (Satz erlaubter CPU) des Verfahrens modifiziert. Jeder Thread wird einen eigenen CPU-Satz haben, aber alle Threads werden ihren CPU-Satz vom übergeordneten Prozess übernehmen.

So dürfen Threads auf jeder CPU aus dem CPU-Satz ausgeführt werden, Migration ist zwischen jeder CPU aus CPU-Satz erlaubt.

Jeder Thread kann sched_setaffinity oder pthread_setaffinity_np (linuxspezifische Variante der Affinität, die für einen einzelnen Thread geändert wird) aufrufen, um seinen CPU-Satz einzugrenzen oder sogar zu erweitern.

Wenn Sie Threads an CPUs binden möchten, verwenden Sie sched_setaffinity oder pthread_setaffinity_np direkt in jedem Thread, oder im Falle von OpenMP set affinity über OMP-Bibliothek: OpenMP and CPU affinity z. mit dem Befehl (OpenMP 3.1+)

export OMP_PROC_BIND=true 

Ich glaube, dass OMP Bibliothek CPUs in Round-Robin-Weise aus CPU-Satz von Prozess zum Zeitpunkt der Initialisierung omp Bibliothek auswählt.

Für ältere Version von libgomp - OMP Support-Bibliothek von GCC verwendet - können Sie erlaubt Satz von CPU mit dem Befehl übergeben:

export GOMP_CPU_AFFINITY=0-1,4-5,8-9 

PS: Ihre Themen Platzierung überprüfen Sie top und aktivieren Sie „Last CPU beginnen verwendet "Feld mit fj Tasten und schalten Sie das Gewinde Display mit H.