Multi Core in der Automation

Microarchitecture: Die Neuerungen

Mit der Einführung der Woodcrest-, Conroe- und Merom-Produkte hat Intel die neue Core Microarchitecture in allen Segmenten der Embedded-Roadmap eingeführt.

Nachdem sich die Netburst-Architektur aus mehreren Gründen für eine weitere CPU-Generation verbietet, kombiniert die Core Microarchitecture die Vorteile von Netburst und der mobilen Yonah-Architektur und geht mit einigen Verbesserungen darüber hinaus. Die wichtigsten Neuerungen und deren Auswirkungen auf die Systemperformance sind:

Seit der Einführung der Dynamic Execution in der P6- Architektur (Pentium II/Pentium III), wurde diese im Zuge der Netburst-Architektur zur Advanced Dynamic Execution erweitert. Darunter fallen Techniken wie die Datenfluss-Analyse, die spekulative Ausführung von Instruktionen sowie die Out-of-order-Execution. Hierbei werden Befehle nicht zwingend nacheinander bearbeitet, sondern in einer Reihenfolge ausgeführt, die den Prozessor optimal auslastet. Durch eine erweiterte Branch Prediction wird die Vorhersage-Genauigkeit erhöht und damit ein erneutes Laden von Instruktionen durch fehlerhafte Vorhersagen verhindert. Die Core Microarchitecture erweitert diese Fähigkeiten, indem sie mehr Instruktionen pro Zyklus laden, decodieren und ausführen kann – vier im Vergleich zu drei Instruktionen bei vorherigen Architekturen. Um die Energie-Effizienz noch weiter voran zu treiben (Performance/Watt), sind diese CPUs in der Lage, durch Macrofusion sehr häufig vorkommende x86-Instruktionen in eine Mikro-Operation zu überführen und damit Zyklen bei der Ausführung zu sparen. Somit erzeugt der Decoder zum Beispiel aus einem Vergleich (CMP) und dem folgenden, bedingten Sprung (JNE) eine einzige Mikro-Operation (CMPJNE). Entsprechend wurden die ALUs erweitert und können nun mit diesen kombinierten Befehlen umgehen.

Eine wichtige Neuerung der Prozessorarchitektur betrifft den Aufbau des L2-Cache. Während bei anderen Dual/Multi-Core-Designs jeder Kern über einen separaten L2-Cache verfügt, haben beispielsweise die beiden Kerne einer Core-2-Duo-CPU einen gemeinsamen L2-Cache. Dieser Aufbau unterstützt Softwaredesigns, welche Threads einer Applikation auf beiden Kernen laufen lassen. Jeder Teil dieser Applikation braucht Zugang zu den zu bearbeitenden Daten – idealerweise solchen, die schon im L2-Cache vorliegen. Durch die gemeinsame Nutzung hat jeder Kern vollen Zugriff auf den Cache und sieht die Daten. Bei getrenntem Cache sind zeitintensive Transfers zwischen den Speichern notwendig.

Smart Memory fasst Techniken zusammen, die durch eine optimale Ausnutzung der Bandbreite auf den Speicherbussen eine Zugriffsverzögerung verhindern sollen. Neu ist hierbei die Memory Disambiguation, die es der CPU ermöglicht, intelligent zu entscheiden, ob ein „Load“ schon vor einem „Store“ stattfinden kann. – In alten Prozessorarchitekturen wurde dies strikt verboten, um die Datenkohärenz sicherzustellen, da sonst Daten geladen werden konnten, die vielleicht schon veraltet waren und mit dem nächsten Store überschrieben wurden. Damit wird eine Out-of-order-Verarbeitung der Befehle in gesteigertem Maße möglich, die wiederum Zeit und somit Energie spart. Selbst eine Fehleinschätzung dieser Algorithmen führt nicht zu einer Invalidierung der Daten, sondern zu einem Nachladen der korrekten Daten. Eine weitere Eigenschaft der neuen Prozessorarchitektur behandelt das Problem der Speicherbandbreite. Die Intel Core Microarchitecture führt insgesamt acht Prefetcher ein, die dafür sorgen, dass die Daten möglichst früh und zu einem Zeitpunkt geladen werden, da der Bus nicht zu stark belastet ist. Jeder Kern einer Dual-Core-CPU besitzt drei dieser Einheiten – zwei für Daten, einen für Instruktionen; die letzten beiden füllen den geteilten L2-Cache mit Daten. Zusammengenommen sorgen all diese Änderungen in der CPU-Architektur für einen Performancezuwachs von bis zu 90 %, bei einer um bis zu 40 % gesenkten Leistungsaufnahme. Eine auf diese Prozessorarchitektur ausgerichtete Software kann als zukunftssicher gelten, da sie mit den kommenden Generationen von Multicore-Prozessoren kompatibel ist und durch ihren modularen Aufbau mehr Funktionen bietet, beziehungsweise Funktionen mit mehr Ressourcen ausstatten kann.

Dies gibt Windows wie auch TwinCAT die Möglichkeit, die Abarbeitung von Programmteilen optimal auf die verfügbaren CPU-Cores zu verteilen (Stichwort: Load-Balancing). Monolithische Programme werden zwar weiterhin funktionieren, aber sie werden die vorhandene Rechenkapazität zu einem immer geringer werdenden Teil nutzen können. Zu beachten ist bei der Entwicklung von Anwendungen mit mehreren Threads eine saubere Synchronisierung der verschiedenen Programmteile beim Zugriff auf gemeinsame System-Ressourcen. Hierzu stellt das jeweilige Betriebssystem geeignete Mechanismen wie Semaphoren und Critical Sections zur Verfügung.

Die physikalisch parallele Abarbeitung von Programmteilen fordert auch bei erfahrenen  Entwicklern ein teilweises Umdenken. In streng prioritätsgesteuerten Echtzeit-Systemen läuft der höchstpriore Thread auf sein Ende, ohne unterbrochen zu werden. Diese Eigenschaft berechtigt auf Single-Core-Systemen zu der Annahme, dass zur Laufzeit des hochprioren Threads kein niederpriorer Thread aktiv ist. Dies gilt für Multi-Core-Systeme allerdings nicht mehr, während der höchstpriore Thread von einem Core abgearbeitet wird, können gleichzeitig niederpriore Threads von anderen Cores bearbeitet werden. Das Sperren von Interrupts ist bei Multi-Core-CPUs ebenfalls keine geeignete Synchronisierungsmethode mehr, da die Sperrung nur für den jeweils genutzten Core gilt. hap