Ich benutze einen parallelen Algorithmus mit Light Threads und frage mich, wie diese verschiedenen Kernen zugewiesen werden, wenn das System mehrere Kerne und mehrere Chips bereitstellt. Werden Threads einem einzelnen Chip zugewiesen, bis alle Kerne auf dem Chip erschöpft sind? Werden Threads Kernen auf verschiedenen Chips zugewiesen, um die Arbeit besser zwischen den Chips zu verteilen?Wie werden leichtgewichtige Threads vom Linux-Kernel auf einem Multichip-Multicore-SMP-System geplant?
Antwort
Sie sagen nicht, auf welchem Betriebssystem Sie sind, aber unter Linux werden Threads einem Kern basierend auf der Last auf diesem Kern zugewiesen. Ein Thread, der zum Ausführen bereit ist, wird einem Kern mit der niedrigsten Auslastung zugewiesen, sofern Sie nicht anders angeben, indem Sie die Threadaffinität festlegen. Sie können dies mit sched_setaffinity()
tun. Weitere Informationen finden Sie auf der Manpage. Im Allgemeinen, wie mayes1979 sagte, ist dies etwas, das von dem Scheduler entschieden wird, der in dem Betriebssystem implementiert ist, das Sie verwenden.
Je nach der von Ihnen verwendeten Linux-Version gibt es zwei hilfreiche Artikel: this article describes early 2.6 kernels, up through 2.6.22 und this article describes kernels newer than 2.6.23.
Danke für Ihre Antwort. Ja, das Betriebssystem ist Linux. – rreyes1979
danke @sarnold für die aktualisierte Referenz – kch
Lassen Sie mich sehen, wenn ich das bekomme: Ein Thread ist der Kern mit der niedrigsten Last zugeordnet, aber Sie können eine Thread-Affinität festlegen, um einen Kern "vorschlagen". Nun dachte ich, dass ein Thread normalerweise dem Kern zugewiesen wurde, in dem er bereits lief, um Cache-Misses zu vermeiden. Wenn dies der Fall ist, versucht der Thread, auf dem Kern zu bleiben, in dem er zu arbeiten begonnen hat, aber wenn der Kern beschäftigt ist, kann er zu einem anderen "wandern", um den Lastausgleich durchzuführen. Fehle ich etwas? – rreyes1979
Verschiedene Threading-Bibliotheken führen Threading-Operationen anders aus. Der "Standard" in Linux heutzutage ist NPTL, der Threads auf derselben Ebene wie Prozesse plant. Das ist ziemlich gut, da die Prozess-Erstellung unter Linux schnell ist und immer schnell bleiben soll. Der Linux-Kernel versucht eine sehr starke CPU-Affinität für die Ausführung von Prozessen und Threads bereitzustellen, um das Verhältnis von Cache-Treffern zu Cache-Fehlern zu erhöhen. Wenn eine Aufgabe immer auf demselben Kern ausgeführt wird, ist sie wahrscheinlich bereits ausgefüllt Cache-Zeilen.
Das ist normalerweise eine gute Sache, aber ich habe bemerkt, dass der Kernel Aufgaben nicht immer von ausgelasteten Kernen auf leere Kerne migriert. Dieses Verhalten kann sich von Version zu Version ändern, aber ich habe mehrere CPU-gebundene Aufgaben gefunden, die alle auf einem Kern ausgeführt werden, während drei andere Kerne inaktiv waren. (Ich fand es, indem ich bemerkte, dass ein Kern sechs oder sieben Grad Celsius wärmer als die anderen drei war.)
Im Allgemeinen sollte das Richtige gerade passieren; Wenn der Kernel jedoch Aufgaben nicht automatisch auf andere Prozessoren migriert, können Sie mit dem Befehl taskset(1)
die für Programme zulässigen Prozessoren einschränken oder Ihr Programm so ändern, dass die Funktion pthread_setaffinity_np(3)
nach einzelnen Threads fragt, die migriert werden sollen. (Dies ist vielleicht am besten für In-House-Anwendungen - einer Ihrer Benutzer möglicherweise nicht wollen Ihr Programm alle verfügbaren Kernen zu verwenden. Wenn Sie wählen, Aufrufe an diese Funktion in Ihrem Programm einzuschließen, stellen Sie sicher, dass es über Konfiguration konfigurierbar ist Dateien, die eine ähnliche Funktionalität wie das Programm taskset(1)
bieten.)
ein guter Punkt auf Linux, die Caches warm zu halten (anscheinend auch im wörtlichen Sinne). [Hier] (http://littledaemons.wordpress.com/2009/01/22/cpu-affinity-and-taskset/) ist eine weitere Diskussion darüber für die Referenz von OP. – kch
- 1. Wie sind Java-Threads geplant?
- 2. Werden 32 Threads von 32 Block als Warp geplant?
- 3. Wie werden Akka-Akteure auf zugrunde liegenden Threads implementiert?
- 4. Wie genau werden Tasklets intern geplant?
- 5. Leichtgewichtige Optionen für flexible Datenpersistenz
- 6. Gibt es eine leichtgewichtige plattformübergreifende C++ - Dateisystembibliothek?
- 7. jQuery Slider funktioniert nicht auf dem Handy wie geplant
- 8. Alle Threads werden suspendiert
- 9. Warum Child Threads lebendig nach dem Haupt Threads getötet werden?
- 10. Wie werden Register unter Threads geteilt?
- 11. Wie erfolgt die Kontextumschaltung von Threads auf einem Multicore-Prozessor?
- 12. Wie gleichzeitige Threads in Perl ausgeführt werden?
- 13. Post-Methode Keine Warnungen wie geplant geben?
- 14. Leichtgewichtige Migration von Core Data - werden vorhandenen Entitäten neue Attribute hinzugefügt?
- 15. Threads in einem Vektor können nicht verbunden werden
- 16. Wie werden Threads in .NET mit der Eigenschaft Name aufgelistet?
- 17. Ausnahmen auf Threadpool Threads
- 18. Geplant Automatisieren Ausführung des Tests in Nunit
- 19. Wie alle Threads in der Struktur gestoppt werden?
- 20. Posts, die über Graph API geplant werden, werden häufig nicht veröffentlicht
- 21. Wie HttpRequest Daten vom Client gesendet werden, auf Server
- 22. Wie kann auf Daten vom Geschwisterstatus zugegriffen werden?
- 23. senden Recv auf einem Sockel von mehreren Threads
- 24. So planen Sie Java-Threads
- 25. Wie werden die Threads in einer COM-Komponente erstellt?
- 26. Threads Grenze auf Android?
- 27. Wie werden Java-Systemeigenschaften vom Host abgeleitet?
- 28. Signalisieren aller Threads in einem Prozess
- 29. Welche Ressourcen werden zwischen Threads geteilt?
- 30. Wie lange werden Pakete vom SyncManager beibehalten?
Welche Threading-Bibliothek verwenden Sie? – sarnold
Wir verwenden Pthreads. – rreyes1979
Ist diese Verhaltensbibliothek abhängig? Dachte, dass diese Details vom Kernel-Scheduler gehandhabt werden. – rreyes1979