Prozessoren, Kerne und Threads. Systemtopologie

  • Tutorial
In diesem Artikel werde ich versuchen, die Terminologie zu beschreiben, die zur Beschreibung von Systemen verwendet wird, die mehrere Programme parallel ausführen können, dh Multi-Core, Multi-Prozessor, Multi-Threaded. Verschiedene Arten von Parallelität in der IA-32-CPU traten zu unterschiedlichen Zeiten und in einer etwas inkonsistenten Reihenfolge auf. Bei all dem kann es leicht zu Verwirrung kommen, insbesondere wenn man bedenkt, dass Betriebssysteme Details vor nicht allzu hoch entwickelten Anwendungsprogrammen sorgfältig verbergen.



Die nachfolgend verwendete Terminologie wird in der Dokumentation für Intel-Prozessoren verwendet. Andere Architekturen können für ähnliche Konzepte unterschiedliche Namen haben. Wo ich sie kenne, werde ich sie erwähnen.

Der Artikel soll zeigen, dass mit der Vielzahl der möglichen Konfigurationen von Multiprozessor-, Multi-Core- und Multi-Thread-Systemen für darauf ausgeführte Programme sowohl Möglichkeiten zur Abstraktion (Ignorierung von Unterschieden) als auch zur Spezifität (programmgesteuertes Erlernen der Konfiguration) geschaffen werden.

Warnung vor Zeichen ®, ™, © im Artikel
Mein Kommentar erklärt, warum Mitarbeiter des Unternehmens in der öffentlichen Kommunikation Copyright-Zeichen verwenden sollten. In diesem Artikel mussten sie ziemlich oft verwendet werden.


CPU


Natürlich ist der älteste, am häufigsten verwendete und mehrdeutige Begriff „Prozessor“.

In der modernen Welt ist ein Prozessor etwas (Paket), das wir in einer schönen Retail-Box oder einer nicht so schönen OEM-Tasche kaufen. Eine unteilbare Entität, die in den Sockel auf der Hauptplatine eingefügt wird. Auch wenn kein Stecker vorhanden ist und Sie ihn nicht entfernen können, dh wenn er fest verlötet ist, handelt es sich um einen Chip.



Mobile Systeme (Telefone, Tablets, Laptops) und die meisten Desktops verfügen über einen Prozessor. Auf Workstations und Servern befinden sich manchmal zwei oder mehr Prozessoren auf demselben Motherboard.

Die Unterstützung mehrerer CPUs in einem System erfordert zahlreiche Änderungen im Design. Es ist mindestens erforderlich, die physische Verbindung sicherzustellen (mehrere Sockel auf der Hauptplatine vorzusehen) und Probleme mit der Prozessoridentifizierung zu lösen (siehe weiter unten in diesem Artikel sowie in meinem vorherigen Artikel)Anmerkung), Koordination des Speicherzugriffs und der Übermittlung von Interrupts (der Interrupt-Controller muss Interrupts an mehrere Prozessoren weiterleiten können) und natürlich Unterstützung durch das Betriebssystem. Leider konnte ich keine dokumentierte Erwähnung der Schaffung des ersten Multiprozessorsystems auf Intel-Prozessoren finden, aber Wikipedia behauptet , Sequent Computer Systems habe sie bereits 1987 mit Intel 80386-Prozessoren geliefert. Die weit verbreitete Unterstützung für mehrere Chips in einem System wird verfügbar beginnend mit Intel® Pentium.

Wenn mehrere Prozessoren vorhanden sind, verfügt jeder über einen eigenen Anschluss auf der Platine. Gleichzeitig verfügt jeder von ihnen über vollständige unabhängige Kopien aller Ressourcen, z. B. Register, ausführende Geräte und Caches. Sie teilen sich einen gemeinsamen Speicher - RAM. Das Gedächtnis kann auf verschiedene und nicht triviale Weise mit ihnen in Verbindung gebracht werden. Dies ist jedoch eine separate Geschichte, die den Rahmen dieses Artikels sprengt. Es ist wichtig, dass in jeder Situation für die ausführbaren Programme die Illusion eines einheitlichen gemeinsamen Speichers erzeugt wird, auf den von allen im System enthaltenen Prozessoren zugegriffen werden kann.


Startbereit! Intel® Desktop-Motherboard D5400XS

Der Kern


In der Vergangenheit erschien Multi-Core in Intel IA-32 später Intel® HyperThreading, aber in der logischen Hierarchie geht es weiter.

Wenn das System über mehr Prozessoren verfügt, ist die Leistung anscheinend höher (bei Aufgaben, die alle Ressourcen nutzen können). Wenn jedoch die Kommunikationskosten zwischen ihnen zu hoch sind, werden alle Vorteile der Nebenläufigkeit durch lange Verzögerungen bei der Übertragung gemeinsamer Daten zunichte gemacht. Genau dies wird in Multiprozessorsystemen beobachtet - sowohl physikalisch als auch logisch sind sie sehr weit voneinander entfernt. Für eine effiziente Kommunikation unter diesen Bedingungen müssen Sie sich spezialisierte Busse wie Intel® QuickPath Interconnect ausdenken. Der Energieverbrauch, die Größe und der Preis der endgültigen Lösung verringern sich dadurch natürlich nicht. Eine hohe Integration von Komponenten sollte die Rettung sein - Schaltkreise, die Teile eines parallelen Programms ausführen, sollten näher beieinander gezogen werden, vorzugsweise ein Chip. Mit anderen Worten,Kernel , die alle identisch sind, aber unabhängig voneinander funktionieren.

Die ersten IA-32-Multi-Core-Prozessoren von Intel wurden 2005 eingeführt. Seitdem ist die durchschnittliche Anzahl der Kerne auf Server-, Desktop- und jetzt mobilen Plattformen stetig gewachsen.

Im Gegensatz zu zwei Single-Core-Prozessoren in einem System, die nur Speicher gemeinsam nutzen, können zwei Kerne auch über gemeinsame Caches und andere Ressourcen verfügen, die für die Interaktion mit dem Speicher verantwortlich sind. Meistens bleiben die Caches der ersten Ebene privat (jeder Kern hat seinen eigenen), während die zweite und dritte Ebene sowohl allgemein als auch getrennt sein können. Eine solche Organisation des Systems ermöglicht es, Verzögerungen bei der Datenlieferung zwischen benachbarten Kernen zu verringern, insbesondere wenn diese an einer gemeinsamen Aufgabe arbeiten.


Eine mikroskopische Aufnahme eines Vierkern-Intel-Prozessors mit dem Codenamen Nehalem. Separate Kerne, ein allgemeiner Cache der dritten Ebene sowie QPI-Links zu anderen Prozessoren und ein gemeinsamer Speichercontroller werden zugewiesen.

Hyperthread


Bis ungefähr 2002 bestand die einzige Möglichkeit, ein IA-32-System zu erhalten, das zwei oder mehr Programme gleichzeitig ausführen kann, in der Verwendung von Multiprozessorsystemen. In Intel® Pentium® 4 sowie in der Xeon-Produktfamilie mit dem Codenamen Foster (Netburst) wurde eine neue Technologie eingeführt - Hyper-Threads oder Hyper-Threads - Intel® HyperThreading (im Folgenden als HT bezeichnet).

Nichts ist neu unter dem Mond. HT ist ein Spezialfall von dem, was in der Literatur als simultanes Multithreading (SMT) bezeichnet wird. Im Gegensatz zu "echten" Kerneln, die vollständige und unabhängige Kopien sind, wird im Fall von HT nur ein Teil der internen Knoten in einem Prozessor dupliziert, der in erster Linie für die Speicherung der Architekturstatusregister verantwortlich ist. Die ausführenden Knoten, die für die Organisation und Verarbeitung der Daten verantwortlich sind, bleiben singulär, und höchstens einer der Threads verwendet einen der Streams. Wie Kerne teilen sich Hyperthreads Caches, aber ab welcher Ebene dies vom jeweiligen System abhängt.

Ich werde nicht versuchen, alle Vor- und Nachteile von Designs mit SMT im Allgemeinen und mit HT im Besonderen zu erklären. Ein interessierter Leser kann eine ziemlich detaillierte Diskussion der Technologie in vielen Quellen und natürlich auf Wikipedia finden . Ich nehme jedoch den folgenden wichtigen Punkt zur Kenntnis, der die aktuellen Beschränkungen für die Anzahl der Hyperthreads in realen Produkten erläutert.

Thread-Grenzen

In welchen Fällen ist das Vorhandensein von "unehrlichen" Multicores in Form von HT gerechtfertigt? Wenn ein Anwendungsthread nicht alle ausführenden Knoten im Kernel laden kann, können sie für einen anderen Thread "ausgeliehen" werden. Dies ist typisch für Anwendungen, die keinen Engpass beim Rechnen haben, aber beim Zugriff auf Daten häufig Cache-Fehlschläge generieren und auf die Übermittlung von Daten aus dem Speicher warten müssen. Zu diesem Zeitpunkt muss der Kernel ohne HT inaktiv bleiben. Das Vorhandensein von HT ermöglicht es Ihnen, freie Ausführungsknoten schnell in einen anderen Architekturzustand zu versetzen (da dieser nur dupliziert wird) und dessen Anweisungen auszuführen. Dies ist ein Sonderfall einer Technik, die als Latenz-Ausblenden bezeichnet wird, wenn eine lange Operation, während der nützliche Ressourcen im Leerlauf sind, durch die parallele Ausführung anderer Aufgaben maskiert wird. Wenn die Anwendung bereits einen hohen Auslastungsgrad der Kernelressourcen aufweist,

Typische Desktop- und Serveranwendungen, die für allgemeine Maschinenarchitekturen entwickelt wurden, können mithilfe von HT parallelisiert werden. Dieses Potenzial wird jedoch schnell "aufgebraucht". Vielleicht aus diesem Grund überschreitet die Anzahl der Hardware-Hyperthreads bei fast allen IA-32-Prozessoren nicht zwei. In typischen Szenarien wäre der Gewinn durch die Verwendung von drei oder mehr Hyperthreads gering, aber der Verlust der Größe des Kristalls, seines Energieverbrauchs und der Kosten ist erheblich.

Eine andere Situation tritt bei typischen Aufgaben auf, die an Videobeschleunigern ausgeführt werden. Daher zeichnen sich diese Architekturen durch die Verwendung von SMT-Technologie mit einer größeren Anzahl von Threads aus. Da Intel® Xeon Phi-Coprozessoren (eingeführt im Jahr 2010) ideologisch und genealogisch den Grafikkarten sehr nahe kommen, können sie es seinvier Hyperthreads auf jedem Kern - eine Konfiguration, die nur für IA-32 gilt.

Logischer Prozessor


Von den drei beschriebenen Parallelitätsebenen (Prozessoren, Kerne, Hyperthreads) können einige oder alle in einem bestimmten System fehlen. Dies wird durch BIOS-Einstellungen (Multi-Core- und Multi-Threading-Funktionen werden unabhängig voneinander deaktiviert), Mikroarchitekturfunktionen (HT fehlte in Intel® Core ™ Duo, wurde jedoch mit der Veröffentlichung von Nehalem zurückgegeben) und Systemereignisse (Multiprozessor-Server können bei Fehlfunktionen ausgefallene Prozessoren ausschalten) beeinflusst und weiter "fliegen" auf den verbleibenden). Wie ist dieser mehrstufige Parallelitäts-Zoo für das Betriebssystem und letztendlich für Anwendungen sichtbar?

Der Einfachheit halber bezeichnen wir die Anzahl der Prozessoren, Kerne und Threads in einigen Systemen mit dem Tripel ( xyz ), wobeix ist die Anzahl der Prozessoren, y ist die Anzahl der Kerne in jedem Prozessor und z ist die Anzahl der Hyperthreads in jedem Kern. Des Weiteren werde ich diese Trio- Topologie nennen - ein etablierter Begriff, der wenig mit der Sektion Mathematik zu tun hat. Das Produkt p  =  xyz bestimmt die Anzahl der Entitäten, die als logische Prozessoren bezeichnet werdenSystem. Sie bestimmt die Gesamtzahl der unabhängigen Kontexte von Anwendungsprozessen in einem System mit gemeinsamem Speicher, die parallel ausgeführt werden und die das Betriebssystem berücksichtigen muss. Ich sage "erzwungen", weil es die Ausführungsreihenfolge von zwei Prozessen, die sich auf verschiedenen logischen Prozessoren befinden, nicht steuern kann. Dies gilt auch für Hyperthreads: Obwohl sie auf einem Kern „sequentiell“ arbeiten, wird die spezifische Reihenfolge von der Hardware vorgegeben und steht für die Überwachung oder Steuerung von Programmen nicht zur Verfügung.

In den meisten Fällen verbirgt das Betriebssystem vor den endgültigen Anwendungen die Merkmale der physischen Topologie des Systems, auf dem es ausgeführt wird. Zum Beispiel die folgenden drei Topologien: (2, 1, 1), (1, 2, 1) und (1, 1, 2) - Das Betriebssystem wird in Form von zwei logischen Prozessoren dargestellt, obwohl der erste zwei Prozessoren hat, der zweite zwei Kerne und der dritte - nur zwei Fäden.


Der Windows Task-Manager verfügt über 8 logische Prozessoren. aber wie viel ist es in Prozessoren, Kernen und Hyperthreads?


Linux topverfügt über 4 logische Prozessoren.

Dies ist sehr praktisch für Anwendungsentwickler - sie müssen sich nicht mit Hardwarefunktionen befassen, die für sie häufig nicht relevant sind.

Definition der Softwaretopologie


Die Abstraktion der Topologie auf eine einzige Anzahl logischer Prozessoren schafft in einigen Fällen natürlich genügend Gründe für Verwirrung und Missverständnisse (in heißen Internetstreitigkeiten). Computeranwendungen, die maximale Leistung aus Eisen herausholen möchten, erfordern eine detaillierte Kontrolle darüber, wo ihre Threads platziert werden: näher beieinander auf benachbarten Hyper-Threads oder umgekehrt, weiter entfernt auf verschiedenen Prozessoren. Die Kommunikationsgeschwindigkeit zwischen logischen Prozessoren innerhalb eines einzelnen Kerns oder Prozessors ist erheblich höher als die Geschwindigkeit der Datenübertragung zwischen Prozessoren. Die Möglichkeit der Heterogenität bei der Organisation des Direktzugriffsspeichers erschwert ebenfalls das Bild.

Informationen über die Topologie des Gesamtsystems sowie die Position jedes logischen Prozessors im IA-32 stehen mit der Anweisung CPUID zur Verfügung. Seit dem Aufkommen der ersten Multiprozessorsysteme hat sich das Identifikationsschema der logischen Prozessoren mehrfach erweitert. Bisher sind Teile davon in den Blättern 1, 4 und 11 der CPUID enthalten. Welches der Blätter betrachtet werden soll, ergibt sich aus dem folgenden Blockschaltbild aus dem Artikel [2]:



Ich werde hier nicht auf alle Einzelheiten der einzelnen Teile dieses Algorithmus eingehen. Wenn Interesse besteht, kann der nächste Teil dieses Artikels dem gewidmet werden. Ich werde einen interessierten Leser an [2] senden, in dem diese Frage im Detail behandelt wird. Hier beschreibe ich zunächst kurz, was APIC ist und wie es sich auf die Topologie bezieht. Dann betrachten wir die Arbeit mit Blatt 0xB (elf in Dezimal), das im Moment das letzte Wort in "apical engineering" ist.

APIC ID

Local APIC (Advanced Programmable Interrupt Controller) ist ein Gerät (jetzt Teil des Prozessors), das für die Arbeit mit Interrupts verantwortlich ist, die an einen bestimmten logischen Prozessor gesendet werden. Jeder logische Prozessor hat einen eigenen APIC. Und jeder von ihnen im System muss einen eindeutigen APIC-ID-Wert haben. Diese Nummer wird von Interrupt-Controllern zur Adressierung der Zustellung von Nachrichten und von allen anderen (z. B. dem Betriebssystem) zur Identifizierung logischer Prozessoren verwendet. Die Spezifikation für diesen Interrupt-Controller wurde von Intel 8259 PIC über Dual PIC, APIC und xAPIC zu x2APIC weiterentwickelt .

Derzeit hat die Breite der in der APIC-ID gespeicherten Nummer die vollen 32 Bits erreicht, obwohl sie in der Vergangenheit auf 16 und noch früher auf nur 8 Bits beschränkt war. Heutzutage sind die Überreste alter Zeiten auf der CPUID verstreut, jedoch werden alle 32 Bits der APIC-ID in CPUID.0xB.EDX [31: 0] zurückgegeben. Auf jedem logischen Prozessor, der den CPUID-Befehl unabhängig ausführt, wird sein Wert zurückgegeben.

Klärung der Beziehung

Der APIC-ID-Wert allein sagt nichts über die Topologie aus. Um herauszufinden, welche zwei logischen Prozessoren sich in demselben physischen System befinden (das heißt, sie sind "Brüder" von Hypertreads), welche zwei sich in demselben Prozessor befinden und welche völlig unterschiedliche Prozessoren sind, müssen Sie ihre APIC-ID-Werte vergleichen. Abhängig vom Grad der Affinität stimmen einige ihrer Bits überein. Diese Informationen sind in der Unterliste CPUID.0xB enthalten, die mit einem Operanden in ECX codiert ist. Jeder von ihnen beschreibt die Position des Bitfelds einer der Topologieebenen in EAX [5: 0] (genauer die Anzahl der Bits, die zur APIC-ID nach rechts verschoben werden müssen, um die unteren Ebenen der Topologie zu entfernen) sowie den Typ dieser Ebene - Hyperthread, Core oder Prozessor , - in ECX [15: 8].



Logische Prozessoren innerhalb desselben Kerns haben alle gleichen Bits der APIC-ID, mit Ausnahme derjenigen, die zum SMT-Feld gehören. Bei logischen Prozessoren, die sich in einem Prozessor befinden, alle Bits mit Ausnahme der Core- und SMT-Felder. Da die Anzahl der Unterblätter für CPUID.0xB zunehmen kann, kann mit diesem Schema die Beschreibung von Topologien mit einer höheren Anzahl von Ebenen unterstützt werden, falls dies in Zukunft erforderlich sein sollte. Darüber hinaus wird es möglich sein, Zwischenstufen zwischen bestehenden Stufen einzuführen.

Eine wichtige Konsequenz der Organisation dieses Schemas besteht darin, dass der Satz aller APIC-IDs aller logischen Prozessoren im System "Lücken" aufweisen kann, d. H. Sie werden nicht nacheinander gehen. In einem Multi-Core-Prozessor mit deaktiviertem HT können sich beispielsweise alle APIC-IDs als gerade herausstellen, da das niedrigstwertige Bit, das für die Codierung der Hyper-Thread-Nummer verantwortlich ist, immer Null ist.

Ich stelle fest, dass CPUID.0xB nicht die einzige Informationsquelle zu logischen Prozessoren ist, die dem Betriebssystem zur Verfügung steht. Die Liste aller ihr zur Verfügung stehenden Prozessoren mit ihren APIC-ID-Werten ist in der MADT-ACPI-Tabelle [3, 4] verschlüsselt.

Betriebssysteme und Topologie


Betriebssysteme stellen Anwendungen Informationen zur Topologie logischer Prozessoren über ihre eigenen Schnittstellen zur Verfügung.

Unter Linux sind die Topologieinformationen /proc/cpuinfosowie die Ausgabe des Befehls in der Pseudodatei enthalten dmidecode. Im folgenden Beispiel filtere ich den Inhalt von cpuinfo auf einem Quad-Core-System ohne HT und lasse nur topologische Einträge:
Versteckter Text
ggg@shadowbox:~$ cat /proc/cpuinfo |grep 'processor\|physical\ id\|siblings\|core\|cores\|apicid'
processor       : 0
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 2
apicid          : 0
initial apicid  : 0
processor       : 1
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 2
apicid          : 1
initial apicid  : 1
processor       : 2
physical id     : 0
siblings        : 4
core id         : 1
cpu cores       : 2
apicid          : 2
initial apicid  : 2
processor       : 3
physical id     : 0
siblings        : 4
core id         : 1
cpu cores       : 2
apicid          : 3
initial apicid  : 3



In FreeBSD wird die Topologie über den Mechanismus sysctl in der Variablen kern.sched.topology_spec als XML gemeldet:
Versteckter Text
user@host:~$ sysctl kern.sched.topology_spec
kern.sched.topology_spec: 0, 1, 2, 3, 4, 5, 6, 70, 1, 2, 3, 4, 5, 6, 70, 1THREAD groupSMT group2, 3THREAD groupSMT group4, 5THREAD groupSMT group6, 7THREAD groupSMT group



In MS Windows 8 werden Topologieinformationen im Task-Manager angezeigt.
Versteckter Text



Sie werden auch vom Konsolendienstprogramm Sysinternals Coreinfo und dem API-Aufruf GetLogicalProcessorInformation bereitgestellt .

Vollbild


Ich werde noch einmal die Beziehung zwischen den Begriffen "Prozessor", "Kern", "Hyper-Thread" und "logischer Prozessor" mit ein paar Beispielen veranschaulichen.

System (2, 2, 2)



System (2, 4, 1)



System (4, 1, 1)



Andere Angelegenheiten


In diesem Abschnitt habe ich einige Besonderheiten herausgearbeitet, die sich aus der mehrstufigen Organisation logischer Prozessoren ergeben.

Caches

Wie bereits erwähnt, bilden die Caches im Prozessor auch eine Hierarchie, und sie hängen ziemlich stark mit der Topologie der Kerne zusammen, sind jedoch nicht eindeutig festgelegt. Um festzustellen, welche Caches für welche logischen Prozessoren gemeinsam sind und welche nicht, wird die Ausgabe von CPUID.4 und seiner Unterliste verwendet.

Lizenzierung

Einige Softwareprodukte werden mit der Anzahl der Lizenzen geliefert, die von der Anzahl der Prozessoren in dem System abhängt, auf dem sie verwendet werden. Andere - nach der Anzahl der Kerne im System. Um die Anzahl der Lizenzen zu bestimmen, kann die Anzahl der Prozessoren je nach Prozessortyp mit einem Bruchteil des „Kernfaktors“ multipliziert werden!

Virtualisierung

Virtualisierungssysteme, die Multicore-Systeme simulieren können, können virtuellen Prozessoren in einer Maschine eine beliebige Topologie zuweisen, die nicht mit der Konfiguration der realen Hardware übereinstimmt. Innerhalb des Host-Systems (1, 2, 2) bringen einige bekannte Virtualisierungssysteme standardmäßig alle logischen Prozessoren auf die höhere Ebene, d. H. Erstellen Sie eine Konfiguration (4, 1, 1). In Kombination mit topologiespezifischen Lizenzierungsfunktionen können so unterhaltsame Effekte erzielt werden.

Vielen Dank für Ihre Aufmerksamkeit!

Literatur


  1. Intel Corporation. Entwicklerhandbuch für Intel® 64- und IA-32-Architekturen. Bände 1-3, 2014. www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html
  2. Shih Kuo. Intel® 64 Architecture Processor Topology Enumeration, 2012 - software.intel.com/de-de/articles/intel-64-architecture-processor-topology-enumeration
  3. OSDevWiki. MADT. wiki.osdev.org/MADT
  4. OSDevWiki. Erkennen der CPU-Topologie. wiki.osdev.org/Detecting_CPU_Topology_%2880x86%29



Jetzt auch beliebt: