Ich habe eine 2-Socket-Maschine mit jeweils 14 Kernen und Hyper-Threading aktiviert - damit insgesamt 14 * 2 * 2 = 56 Verarbeitungseinheiten oder logische CPUs.libgomp: Thread-Erstellung fehlgeschlagen: Ungültiges Argument nach dem Deaktivieren/Aktivieren von CPUs
ich alle ungeraden CPUs gesperrt (1, 3, 5, 7, ..., 53, 55), indem Sie:
for i in {1..55..2}; do echo 0 > /sys/devices/system/cpu/cpu$i/online; done
/sys/devices/system/cpu/online shows 0 2 4 6 ... 52 54
Nun, wenn ich mehrere Threads zu erstellen bin versucht (= 28) mit OpenMP ich erhalte folgende Fehlermeldung:
libgomp: Thread creation failed: Invalid argument
ich es wieder zurück, indem sie:
for i in {1..55..2}; do echo 1 > /sys/devices/system/cpu/cpu$i/online; done
/sys/devices/system/cpu/online shows 0-55
Trotzdem bin ich die gleichen Fehler.
Irgendwelche Gedanken?
Edit: Code funktionierte gut für eine beliebige Anzahl von Threads, bevor ich die obigen Experimente durchgeführt habe.
Wenn Sie versuchen, 1 Thread pro Kern auszuführen, scheint die Thread-Platzierung nur beratend zu sein, und es ist besser, die GOMP_CPU_AFFINITY-Maske einfach festzulegen, wenn libgomp das Ziel für Affinität unterstützt. Wenn nicht, müssen Sie bereit sein, jeden Thread für die logische CPU-Zuweisung zu akzeptieren. – tim18
Ich glaube, es geht nicht um Affinität. Es kann einfach nicht mehr als 1 Thread laufen. Möglicherweise konnte es abgesehen von CPU0 (die überhaupt nicht deaktiviert werden kann) keine andere CPU sehen. Ich weiß nicht, ob die Deaktivierung/Aktivierung von CPUs irgendwelche OpenMP-Umgebungsvariablen beeinflusst oder löscht. konnte auch keinen Artikel finden. – MrA