Lexikon

Multicore-Architekturen

Einleitung:

Alle Hersteller von Standard-Mikroprozessoren bieten seit 2005 „Multicore-Architekturen“ an, bei denen auf einem Prozessorchip zwei oder mehr Prozessoren realisiert sind. Im englischen Sprachgebrauch hat sich zur Bezeichnung von mehreren physischen Prozessoren auf einem Chip der Begriff „core“ im Gegensatz zu „processor“, dem Einzelprozessor auf dem Chip, etabliert. Bis 2015 erwartet man 128 oder mehr Prozessoren auf dem Multicore-Chip. Diese Entwicklung beeinflusst die Software fundamental, weil Multicore-Architekturen nur dann sinnvoll genutzt werden, wenn Programme den angebotenen Parallelismus auch nutzen. Parallele Programmierung verlässt also die Nische des Hochleistungsrechnens und wird zum Standard.

Halbleitertechnologie und Multicore

Seit mehr als 40 Jahren folgt die Entwicklung der Halbleiterbausteine dem „Gesetz von Moore“, nach dem die Anzahl der auf dem Chip integrierten Transistoren alle 18 Monate verdoppelt wird. Die Rechenleistung von Mikroprozessoren konnte durch Nutzung des steigenden Transistorangebots für zusätzliche Funktionalität des Prozessors und gleichzeitige Erhöhung der Taktfrequenz proportional zum Gesetz von Moore gesteigert werden. Da die Leistungsaufnahme der Prozessoren proportional zur Taktfrequenz ist und Leckströme stark ansteigen, entwickelte sich dies zum doppelten Problem: die Wärmeentwicklung im Chip kann zur Selbstzerstörung führen, und die Batterien tragbarer Geräte können nicht ausreichend Leistung liefern. Um diese Entwicklung zu reduzieren, wurden aufwendige Stromspartechniken entwickelt, z. B. um lastabhängig die Taktrate zu reduzieren oder vorübergehend inaktive Teile der Prozessorlogik abzuschalten. Eine dauerhafte Lösung, mehr Rechenleistung aus dem Prozessorchip zu erhalten und gleichzeitig die Leistungsaufnahme niedrig zu halten, ist wesentlich dadurch zu erreichen, dass die Taktfrequenz nicht weiter erhöht wird und die zusätzlichen Transistoren für parallel arbeitende Prozessoren auf dem Chip genutzt werden.

Moderne Mikroprozessoren waren bisher durch hochgradigen Parallelismus auf der Ebene der Ausführung einzelner Maschinenbefehle (ILP, „Instruction Level Parallelism“) gekennzeichnet. Dazu zählen Techniken wie das Maschinen-befehlspipelining, superskalare Rechenwerke mit Ausführung außerhalb der Programmreihenfolge (Out-of-Order-Execution), spekulative Ausführung und Sprungvorhersagetechniken sowie VLIW-Techniken (Very Long Instruction Word). Um die Rechenleistung im Sinne höheren Durchsatzes weiter zu steigern, wurden dann mehrfädige Prozessoren entwickelt (multithreaded processors) bei denen die Prozessorhardware je nach Architekturvariante abwechselnd oder gleichzeitig Maschinenbefehle von verschiedenen Prozessen ausführt, um Wartezeiten in den beteiligten Prozessen, z. B. beim Speicherzugriff, zu überbrücken. Die mehrfädige Arbeitsweise hat in den Prozessoren zusätzlich zum Parallelismus auf Maschinenbefehlsebene den Parallelismus auf Programmebene eingeführt, der durch die parallel arbeitenden Prozessoren der Multicore-Architekturen weiter verstärkt wird. So haben bereits heutige Prozessorchips bis zu acht Prozessoren zu je vier Ausführungsfäden, so dass auf einem Chip bis zu 32 Prozesse quasigleichzeitig ausgeführt werden können (vgl. Bild 1).

Die Beschleunigung der Arbeitsweise der Prozessoren hat allerdings kein Äquivalent auf der Seite der Speicherarchitektur. Moderne Mikroprozessoren kompensieren dies durch eine mehrstufige Cachespeicher-Hierarchie. Durch Multicore-Architekturen verstärkt sich die Kluft zwischen Arbeitsgeschwindigkeit des Prozessorchips und der Speicherchips vor allem, weil die Cores eines Chips in der Regel auf einen gemeinsamen Hauptspeicher zugreifen. Dieser gemeinsame Speicher wird zum Flaschenhals, weil er Befehle und Daten für die Cores liefern muss und zusätzlich für die Kommunikation zwischen den Cores benutzt wird. Verschiedene Cachespeicherstrukturen werden daher vorgeschlagen. Einige Prozessoren von Multicore-Architekturen verfügen z. B. über einen separaten Cache der 1. Stufe (FLC: First Level Cache) sowie einen gemeinsamen Cache der 2. Stufe (SLC: Second Level Cache); vgl. Bild 2, zum Teil sind die gemeinsamen Caches auch gruppenweise organisiert.

Programmierung von Multicore-Architekturen

Bei Mikroprozessoren mit Mehrfädigkeit ohne Multicore-Eigenschaft wurde die Prozessorparallelität zum Teil dadurch genutzt, dass quasigleichzeitig zum Benutzerprozess ein Systemprozess („helper thread“) ausgeführt wurde, der Hilfsdienste für die effiziente Abarbeitung des Benutzerprozesses leistet, z. B. das vorzeitige Laden von Programmen und Daten in den Cachespeicher des Prozessors („pre-fetching“). Durch den hohen Parallelitätsgrad von Multicore-Architekturen auf Programmebene ist es für die effiziente Nutzung der Hardware erforderlich, dass auf dem Prozessorchip entweder mehrere unabhängige Prozesse oder parallele leichtgewichtige Prozesse (threads) zu einem Programm gleichzeitig ausgeführt werden. Mit anderen Worten: die Multicore-Architektur künftiger PC-Prozessoren wird nur dann vernünftig genutzt, wenn auch Standard-PC-Anwendungen mehrfädig implementiert sind. Damit entsteht die Notwendigkeit, Standard-Anwendungen zu parallelisieren: die parallele Programmierung wird so zum Standard und verlässt die Nische des Hochleistungsrechnens.

Für die Parallelisierung von Programmen existieren unterschiedlichste Ansätze. Man unterscheidet:

  • automatische, compilergestützte oder manuelle, explizite Parallelisierung,
  • Datenparallelisierung oder Programmparallelisierung,
  • nachrichtenorientierte Kommunikation oder Kommunikation über gemeinsamen Speicher.

Klassische Programmiersprachen unterstützen durch ihre Semantik nicht das Konzept der Parallelität. Klassische Programme sind daher sequentiell. Erst durch das Betriebssystem bzw. das Programmiermodell wird Parallelität eingeführt. Nur spezielle parallele Programmiersprachen, aber auch einige Programmiermodelle, Werkzeuge und zugehörige Compiler unterstützen die unterschiedlichen Varianten paralleler Programmierung. Für Multicore-Architekturen wird derzeit als gebräuchlichstes Modell die automatische, compilergestützte Parallelisierung mit Unterstützung durch explizite Direktiven sowie ein mehrfädiges Ausführungsmodell mit Kommunikation über gemeinsamen Speicher favorisiert. Künftig werden viele Anwendungen, aber auch die manuelle, explizite Parallelisierung und die Nutzung nachrichtenorientierter Programmiermodelle notwendig sein. Hierfür müssen geeignete Programmiersprachen erst noch entwickelt werden.

Parallele Programmierung ist bekanntlich schwierig und fehleranfällig. Es ist daher zu erwarten, dass ausgehend von der Entwicklung der Multicore-Architektur als Standardarchitektur für Mikroprozessoren neue parallele Programmiersprachen und Programmiermodelle entstehen, die insbesondere den Programmierer darin unterstützen, Kommunikations- und Synchronisationsfehler in parallelen Programmen zu vermeiden. Das Modell des Transaktions-Speichers „transactional memory“ und die zugehörigen Programmierkonzepte verweisen in diese Richtung.

Da künftige Multicore-Architekturen gegebenenfalls auch auf Anwendungen spezialisierte Prozessoren umfassen werden und Fehlertoleranz der Architektur gegenüber Einzelfehlern in Prozessoren erwünscht ist, wird die Zuordnung zwischen logischen Programmfäden und physischen Prozessoren weiter erschwert.

Insbesondere für Serverarchitekturen wird daher künftig das Konzept der virtuellen parallelen Prozessoren implementiert werden. Eine Serverarchitektur kann dann physisch aus mehreren Multicore-Architekturen mit spezialisierten Prozessoren bestehen, z. B. für Multimedia (MMX) oder Digitale Signalverarbeitung (DSP), vgl. Bild 3. Eine Virtualisierungsschicht des Betriebssystems oder eine eigenständige Virtualisierungsschicht wird auf dieser heterogenen Parallelrechnerarchitektur dann Fehlertoleranz-, Lastausgleich und Platzierungsmechanismen für virtuelle Programmfäden implementieren. Diese Schicht kann dabei auch mit einer Virtualisierungsschicht kooperieren, die die Virtualisierung mehrerer Serversysteme im Sinne von Xen ermöglicht.

Ausblick

In weniger als 10 Jahren werden Standardmikroprozessoren mehr als 128 Prozessoren auf dem Chip aufweisen. Die effiziente Nutzung solcher Hardwarearchitekturen stellt neue Anforderungen an die Programmierung. Programmentwickler werden in der Zukunft parallele Programme entwickeln, testen und warten müssen. Neue Programmiersprachen und -modelle sind gefordert, aber auch die Ausbildung für künftige Informatiker muss das Thema Parallelismus stärker berücksichtigen als das in bisherigen Curricula der Fall war.

Literatur

Architekturen: Microprocessor Report, diverse Artikel zu verschiedenen Architekturen, www.MPRonline.com

Programmierung: Shameem Akhter, Jason Roberts: Multicore Programming, Intel Press 2006, ISBN 0-9764832-4-6

Autoren und Copyright

Prof. Dr. Arndt Bode

Vizepräsident der Technischen Universität München,

Lehrstuhl für Rechnertechnik und Rechnerorganisation

Institut für Informatik,

Boltzmannstraße 3,

85748 Garching b. München

E-Mail: bode@in.tum.de

© Springer-Verlag 2006