Home Computer Prozessor Basics Site Map counter

Paralleles Rechnen

Einführung

Schon immer war man bestrebt die Geschwindigkeit eines Rechners zu erhöhen, dazu gibt es viele Ansätze, wie RISC oder CISC, die Einführung von Caches und Pipelines, SIMD oder VLIW Architekturen. Dieser Artikel ist dem Bestreben gerichtet, durch parallele Ausführung die Geschwindigkeit zu steigern. Ich will dies anhand einiger Prozessoren verdeutlichen. Dieser Artikel erhebt keinen Anspruch alle Konzepte und alle Implementierungen in Prozessoren vorzustellen, sondern will nur einige Ansätze vorstellen.

Das Problem

Nie reicht die Geschwindigkeit eines Rechners aus. Es gibt sehr viele Wege einen Prozessor schneller zu machen. Man kann ihn höher takten, die Befehlsausführungszeiten reduzieren oder Speicher lokal auf den Prozessor holen (Cache). Irgendwann kommt man an einen Punkt, wo diese Schritte nicht mehr viel bringen. Dann geht man normalerweise zur Parallelität über.

Manche Architekturen sind vor vorneherein parallel ausgelegt, wie heute der Itanium Prozessor oder früher die Cyber und Cray Supercomputer von Seymour Cray. Im Normalfall aber entwickelt sich aber eine Architektur und irgendwann muss sie parallelisiert werden. Das ist dann zwangsläufig aufwendiger als eine von vorneherein parallele Architektur.

Allerdings muss die Software mitspielen, das heißt sie muss Parallelität erlauben. Dies wird im folgenden erläutert.

Stufen der Parallelität

Ziel ist es, von einer linearen Code Abfolge auf eine Ausführung in mehreren Einheiten zu kommen. Betrachten wir folgen hypothetischen "Pseudo" Maschinencode

  1. Lade Register R1 mit Inhalt von Speicherstelle 0
  2. Lade Register R2 mit Inhalt von Speicherstelle 1
  3. Addiere R1 und R2, speichere das Ergebnis in R1

So ähnlich arbeiten viele Prozessoren, wenn sie eine Addition durchführen. Es ist klar, das die beiden ersten Ladebefehle voneinander unabhängig sind, also parallel voneinander ausgeführt werden können. Für die Addition gilt dies nicht, diese kann erst durchgeführt werden, wenn beide Register geladen sind.

Dies ist die unterste Ebene von parallelem Arbeiten, auf der Basis von Maschinencode. Hier ist vor allem der Prozessor gefragt, die Befehle zu analysieren und parallel zu verarbeiten. Eventuell wird er dazu Befehle umsortieren. Ein Compiler kann dies vereinfachen, indem er Maschinencode erzeugt, der gut parallelisiert werden kann.

Die nächste Stufe ist eine Hochsprache. Wir finden hier praktisch dasselbe Problem wie bei Maschinenebene, nur auf einer höheren Stufe. Die Codestücke sind länger und ein Compiler kann hier diese so zerpflücken, dass ein Prozessor gut versorgt ist. Idealerweise arbeiten Compiler und Prozessor Hand in Hand. Der Vorteil dieses Vorgehens liegt darin, dass ein Compiler den Quelltext hat, also die Intension eines Programmierers kennt. Die Möglichkeiten zur Optimierung sind hier umfangreicher und man kann viel Logik vom Prozessor in den Compiler auslagern und so den Prozessor einfacher machen, wodurch er preiswerter wird.

Die letzte Stufe stellt den Code um. Bislang erfolgte dies auch, aber nur in der Weise, dass Anweisungen in der Maschinensprache getauscht wurden, aber nicht der Code verändert wurde. Am besten Mal ein Beispiel. In einem Pseudocode Hochsprache würde man ein Zeichen in einer Zeichenkette wie folgt ersetzen:

Schleife: Von v=1 bis zu Länge der Zeichenkette tue

ist Zeichen an der Stelle v gleich dem gesuchten Zeichen dann

Zeichen an der Stelle v = neues Zeichen

ende Schleife

Das ist auf den ersten Blick nicht parallelisierbar, weil man erst ein Zeichen prüfen muss, um es zu ersetzen, aber schreibt man den Code anders, so kann man dies doch parallelisieren:

Schleife: Von v=1 bis zu Länge der Zeichenkette/2 tue

ist Zeichen an der Stelle v gleich dem gesuchten Zeichen dann

Zeichen an der Stelle v = neues Zeichen

ende Schleife

Schleife: Von v=(Länge der Zeichenkette/2)+1 bis zu Länge der Zeichenkette tue

ist Zeichen an der Stelle v gleich dem gesuchten Zeichen dann

Zeichen an der Stelle v = neues Zeichen

ende Schleife

Dieser Code besteht aus zwei Strängen, die einmal die vordere und einmal die hintere Hälfte der Zeichenkette abarbeiteten. Ein Prozessor mit zwei Recheneinheiten könnte dies doppelt so schnell ausführen, denn eine Recheneinheit sucht in der vorderen Hälfte der Zeichenkette, die andere in der hinteren Hälfte. Dafür ist der Code doppelt so lang. (In der Praxis würde man andere Optimierungen bevorzugen, die weniger Speicher benötigen). Auch hier ist die Geschwindigkeit hochgradig vom Compiler abhängig. Hat man Problemstellungen die so gut parallelisierbar sind, so kann man eine beachtliche Steigerung der Rechengeschwindigkeit erreichen. Ein Beispiel aus der Praxis ist das Rendern von Bildern mittels Raytracing. Dabei wird dieselbe Berechnung für jeden Bildpunkt ausgeführt und jede Berechnung ist unabhängig voneinander. Ein Programm welches diese Arbeit also auf verschiedene Einheiten auslagern kann ist schneller als eine die das nicht kann.

Der nächste Schritt geht von einem Codeblock weg auf die nächst höhere Stufe, die des Threads oder eines Prozesses. Ein Programm kann mehrere Prozesse umfassen. So warten Webserver auf eingehende Anfragen und starten für jede Anfrage einen Prozess. Ebenso arbeiten Datenbanksysteme. Aber auch eine Software kann mehrere Prozesse starten. So startet der Renderer POVRay mehrere Threads die jeweils einen Teil des Bildes rendern. Da in einem Betriebssystem für einen PC oder einen Server heute mehrere Dutzend Prozesse schon beim Start aktiv sind, sollte zumindest auf dieser Ebene heute Parallelität möglich sein.

Frühere Ansätze: Superskalarität und Vektorrechner

CRAY Y-MP8Mehrere Recheinheiten auf einem Chip sind nichts neues. Schon 1964 bestand die Cyber 6600 aus Zehn Funktionseinheiten die von einer Steuereinheit gefüttert wurden. Sie Architektur der Befehlsverteilung ähnelte dem des Pentium Prozessor, mit dem Unterschied, dass sich beim Pentium Prozessor alle Einheiten eine gemeinsame Pipeline teilen, während jede Funktionseinheit der Cyber 6600 eine eigene Pipeline hatte. Hat ein Prozessor mehrere Funktionseinheiten die voneinander unabhängig sind, so nennt man ihn "superskalar". Dies drückt aus, das die Einheiten einfache Daten (Skalare) bearbeiten und nicht viele Daten (Vektoren). Das Wort "Super" drückt aus, das es mehrere Recheneinheiten sind und nicht nur eine.

Die Cyber 6600 stammte vom genialen Computerbauer Seymour Cray, der sich später selbstständig machte und mit der Cray 1 im Jahre 1976 den ersten Vektorrechner einführte.

Ein Vektorrechner hat die Besonderheit, dass er Befehle nicht unabhängig voneinander betrachtet. Vielmehr geht er davon aus, dass eine Operation auf sehr viele Werte angewandt werden. Diese sind hintereinander an den Befehl angehängt und daher nennt man diese auch Vektoren (Für ein eindimensionales Feld). Die Cray 1 konnte z.B. eine Multiplikation in 10 Takten durchführen. Jede folgende aber in einem Takt. Dies ging so schnell, weil während eine Multiplikation durchgeführt wird die nächsten Multiplikationen schon vorbereitet werden. Bei der richtigen Programmierung die dieses ausnutzt kann ein Vektorrechner so sehr schnell sein.

Die Geschwindigkeit eines Vektorprozessors ist also sehr stark von der Software abhängig. So hatte eine Cray Y-MP eine Maximalgeschwindigkeit von 300 MFLOP. Eine Untersuchung der Auslastung eines solchen Rechners im nationalen Supercomputercenter der USA ergab eine durchschnittliche Leistung von 70 MFlops mit Extremwerten von 220 MFlops und 10 MFlops.

T400 CPUIn der Mitte der achtziger Jahren gab es die "Transputer" genannten Prozessoren T212, T414, T800 von INMOS. Dies waren 32 Bit RISC Prozessoren mit einer Besonderheit: Jeder Prozessor hatte 4 Ports mit denen er mit je 4 anderen Prozessoren mit einer Datenrate von 5-20 MBit/sec kommunizieren konnte, abgepuffert durch ein 1 KB großes RAM auf dem Chip. Unterstützt von einer besonderen Programmiersprache namens OCCAM konnten so viele Prozessoren simultan an einem Problem arbeiten. Scottland Yard benutzte ein solches System mit einigen Hundert Transputern um Fingerabdrücke mit einer Datenbank abzugleichen. Gegenüber einer Multiprozessormaschine hatte die Transputer Architektur den Vorteil, dass die Ports viel schneller als herkömmliche Bussysteme waren und vor allem die Zusammenarbeit direkt von der Hardware unterstützt wurde.

Der Pentium Weg

Pentium SchaubildDer Pentium ist ein typisches Beispiel für eine gewachsene Architektur. Der Prozessor hat sich aus dem 8086 Prozessor entwickelt. Im Laufe der Zeit wurde dieser höher getaktet, die Ausführungszeiten von Befehlen nahmen immer mehr ab, bis die meisten in 1-2 Taktzyklen ausgeführt wurden. Es wurde der Koprozessor 8087 integriert und ein Cache lokal auf dem Prozessor implementiert.

Mit dem 486 Prozessor hatte man all dies umgesetzt, was sollte man nun noch verändern? Nach 11 Jahren Entwicklung (1978-1989) schien die Weiterentwicklung am Ende. Intel hat einen Weg beschritten der die Funktionseinheiten auf dem Chip erhöht. Jeder Prozessor besteht aus mehreren Untereinheiten die spezifische Aufgaben haben wie z.B. die Ausführung logischer und mathematischer Funktionen (ALU: Algebraisch-Logische Unit) oder das Laden und Speichern von Daten (Load/Store). Bei Prozessoren die mit Fliesskommazahlen umgehen können erfolgt das Rechnen mit diesen in der FPU (Floating Point Unit).

Der Pentium führte nun 2 ALU's ein, spätere Prozessoren erhöhten auch die Zahl der FPU's. Ein Athlon hat z.B. 3 ALU's und 3 FPU's. Diese Vorgehensweise hat den Vorteil einer Softwarekompatibilität. Die Anwendung merkt nichts von den zusätzlichen Einheiten, auch ältere Software läuft noch, nur schneller. Der Pentium ist also superskalar, so wie schon 1965 die CDC 6600.

Allerdings gibt es auch Nachteile. Der Prozessor muss den Maschinencode analysieren und die Befehle so anordnen, dass die Ausführung möglichst durch beide ALU's möglich ist. Man nennt dies im Fachenglisch "Out of Order Execution". Dazu holt er im Voraus Befehle auf dem Speicher, dekodiert diese, und speichert sie im Cache auf dem Prozessor zwischen. Wenn ein Sprung ansteht und dieser bedingt ist (z.B. das letzte Ergebnis 0 war), dann hat die ganze Vorarbeit des Prozessors keinen Sinn mehr. Er kann die dekorierten Befehle im Cache verwerfen und muss mit dieser Arbeit von neuem anfangen. Daher benötigt er umfangreiche Logik um dies vorherzusagen (Branch Prediction). Das alles macht das Design nicht einfacher.

Trotzdem bekommt man nur durch einen Compiler, der für den Prozessor den man verwendet optimiert, die optimale Leistung. Als der Pentium 4 erschien und dieser nur eine FPU anstatt zwei wie beim Vorgänger Pentium 3 hatte, liefen einige optimierte Programme plötzlich 20-25 % langsamer als beim Vorgänger. Neu übersetzte Versionen die nur noch eine FPU voraussetzten erreichten dagegen die gleiche Leistung wie beim Pentium 3.

Der Pentium 4 Weg : Hyperthreading

Pentium 4Der Pentium 4 ist einige Jahre nach dem Pentium entwickelt worden. Inzwischen hat das Prozessorinnere mit den Befehlen nicht mehr viel zu tun. Intern werkelt eine RISC Engine mit vielen Registern, während man nach außen hin so tut, als wäre man ein besonders schneller CISC 486 Prozessor. Mehr zu den Begriffen RISC und CISC finden sie in diesem Artikel auf dieser Website.

Fast alle Einheiten finden sich nun doppelt auf dem Chip. Nun hat Intel den Schritt getan, dass nach außen hin sich der Prozessor als Doppelprozessor darstellt. Diese Technologie namens Hyperthreading (HT) findet man bei den Pentium 4 Prozessoren ab 3 GHz Takt.

Es ist eine konsequente Weiterentwicklung des mit dem Pentium begonnenen Wegs mehrere Funktionseinheiten anzubieten. Allerdings waren diese nach außen hin nicht sichtbar und es gab nur einen Registersatz, den sich alle Funktionseinheiten teilen mussten. Der Pentium 4 HT hat nun einen zweiten Registersatz, der von den Einheiten benutzt werden kann. Software die für ein Mehrprozessorsystem angepasst ist (also mehrere Prozessoren ansprechen kann), sieht es also so aus, als wären zwei Prozessoren vorhanden. Alte Software arbeitet aber nicht schneller. Im Vergleich zu dem im folgenden Absatz diskutierten Power PC Ansatz ist dies ein sehr viel einfacheres Konzept, denn es erfordert nur neue Register und etwas Logik, zusammen weniger als 5 % der Transistoren, die sich schon auf dem Prozessor befinden.

Was dadurch nicht ansteigt ist die Bandbreite d.h. die Datenmenge die ein Prozessor verarbeiten kann. Denn nach wie vor teilen sich beide "virtuelle" Prozessoren denselben Cache und denselben Datenbus. Für bestimmte Anwendungen ist dies von Nachteil.

Es scheint als wäre diese Relativ einfache Lösung die relativ wenig Schaltungsaufwand erfordert keine gute Lösung, denn in vielen Anwendungen zeigte sich keine oder nur eine geringe Beschleunigung. Bei den Doppelkernprozessoren von Intel gibt es daher auch Serien ohne Hyperthreading. Hyperthreading verschwand nach der Pentium 4 Generation wieder zuerst aus dem Design. Als ide Core Mikroarchitektur aber immer mher interne Funktionseinheiten bekam wurde Hyperthreading wieder eingeführt. 2014 setzen die i3- und i7-Serie der iCore Prozessoren von Intel wieder Hyperthreading ein, nun als "logische CPU" (verglichen mit einer physikalischen CPU) bezeichnet. Der Gewinn ist deutlich höher als beim Pentium 4 wo sie nue bei 10$ der Leistung des ersten Prozessors lag. Im Mittel erreichen die logischen CPUs 20-30% der Leistung einer physikalischen CPU. Dies ist auch den deutlich verbreiterten Datenwegen und größeren Caches geschuldet.

Intel hat dadurch dass man ab 2007 AMD in der Leistung abhängen konnte aber auch wenig an der Leistung der Prozessoren für PCs getan. Wenn sie heute (2019) einen PC kaufen, so ist er mit Standard-PC-Software kaum schneller als ein Rechner der einige Jahre alt ist. Vor 2004 war es noch so dass ein 3 Jahre alter PC drei bis viermal langsamer als ein aktueller war. Heute sind es vielleicht noch 10 bis 30% wenn es um die Singlethreadperformance geht, für die meisten Programme die wichtigere Größe.

 Intel hat viel mehr Wert auf Stromsparfunktionen gelegt, da vor allem mobile, leichte Geräte die wenig Strom verbrauchen dürfen boomen. So ist heute ein PC zwar nicht viel schneller, aber vor allem im Betrieb mit ruhendem Desktop, dem normalen Zustand unter Windows viel stromsparender. So veröffentlichte Intel von der zweiten Generation der Haswell-Mikroarchitektur auch zuerst die Prozessoren mit extrem niedriger Leistungsaufnahme (ULV-Versionen), ein Jahr danach steht der Übergang von Haswell zu Broadwell bei den Desktop-Prozessoren im Mai 2015 immer noch aus.

Der Power PC Weg : Multiprozessorcore

Power 5 ProzessorDie neueste Generation des Power PC von IBM geht einen anderen Weg als Intel. IBM hat genau dasselbe Problem wie Intel, auch der Power PC ist in die Jahre gekommen und die Geschwindigkeit ist nicht einfach durch größere Caches mehr massiv steigerbar. Nun ist IBM aber Hersteller von Großrechnern und in denen sind viele Prozessoren verbaut, das Betriebssystems und die Software unterstützten von sich aus mehrere Prozessoren.

So ist in den Power 5 PC Prozessor auf einem "Die", dem Chip, ein Multiprozessorcore untergebracht, das sind 2 oder 4 einzelne Prozessoren auf einem Chip. Gegenüber dem Pentium 4 Ansatz ist jeder dieser Prozessor physikalisch ein eigener (vollständiger) Chip, mit eigener Lade/Speichereinheit nicht nur Recheneinheiten. Das Design ist dadurch aufwendiger, aber bei Anwendungen bei denen der Datendurchsatz zählt, nimmt auch die Leistung zu. Dies sind typische Serveraufgaben. Der Ansatz von Intel beim Pentium 4 steigert nur die Rechengeschwindigkeit, aber nicht den Datendurchsatz.

Dafür muss man beim Power PC jeweils einen kompletten PC Prozessor mehrfach auf einem Chip unterbringen, hat hier also erheblich mehr Transistoren pro Die. Beide Prozessoren benutzen einen gemeinsamen L2 Cache und einen gemeinsamen Bus zum Speicher. Beim Power PC4 sind es 2 Prozessoren pro Chip, beim Power5 ist auch eine Technologie wie Hyperthreading integriert, so dass man zwei reale und vier virtuelle Prozessoren pro Chip hat. Der Chip rechts zeigt 2 Prozessoren auf einem Chip.

Diese Technologie scheint sich auch bei anderen Herstellern durchzusetzen. Mitte 2004 hatten sowohl Sun angekündigt mehrere (bis zu 8) Ultrasparc Kerne mit Cache auf einem Die zu integrieren, wie auch Intel, die solche Multiprozessor Cores für die Xeon Prozessoren angekündigt hat. In der zweiten Hälfte des Jahres 2005 sollen auch Dualcore Pentium 4 und Athlon Prozessoren erscheinen.

Es scheint auch im Hinblick auf eine weitere Steigerung der Leistung der beste Weg sein. Der für die Play Station 3 gedachte Cell Prozessor verfügt schon über 10 Kerne, von denen aber 8 reinrassige SIMD Kerne sind, d.h. vor allem Spiele beschleunigen. Von Nachteil ist, dass die Mehrkernprozessoren niedriger getaktet sind als Einzelprozessoren. Bei Intel sollen die ersten Dual Cores z.B. nur 2.6 GHz Takt erreichen, während zum selben Zeitpunkt ein Pentium 4 schon bei 3.8-4 GHz angekommen sein wird.

Multiprozessorkerne sind die Technologie die heute von den meisten Herstellern implementiert wird. Doch es gibt auch Einschränkungen. Zum einen hängt die Leistung wie bei anderen Systemen auch von der Speicheranbindung ab. Schon lange gibt es ja Rechner mit mehreren Einzelprozessoren. Diese haben jeweils einen eigenen Cache und oft auch einen eigenen Speicher. Ein Multiprozessorkern kann diese Architektur beibehalten, aber auch sparsam und einen gemeinsamen Cache und einen gemeinsamen Speicherbus nutzen. Das letztere bedeutet praktisch eine Halbierung der Cachegröße und der Bandbreite.

Das Problem der hohen Stromaufnahme verschärft sich noch: So ziehen die Pentium 4 und Athlon Doppelkernprozessoren mehr Strom als ihre höher getakteten Einzelprozessorvorgänger. Dies resultiert aus den höheren Transistorzahlen.

Für Desktop Anwendungen d.h. den typischen Büro PC kommt noch das Softwareproblem dazu. Es gibt einfach zu wenig Software die einen zweiten Prozessor nützen könnte. Realistisch ist eine Geschwindigkeitssteigerung nur bei einigen Anwendungen zu Erwartungen : Bildbearbeitung, Videoschnitt und spiele werden gerne genannt, doch obwohl Intel die Doppelkernprozessoren schon seit längerem angekündigt hat gibt es zur Markteinführung nur wenig Software die den zweiten Kern nutzen könnte. Für den normalen Anwender soll der Hauptnutzen darin bestehen, dass es keine Lastspitzen mehr gibt (erkennbar an der "Sanduhr") weil man bei 100 % CPU Last einer Anwendung immer noch eine zweite CPU hat die den Desktop steuert und Befehle entgegennimmt. Das mag ein Vorteil sein, doch spätestens wenn nach einigen Jahren dann 4 oder 8 Prozessoren auf einem Die sind sollte man eine bessere Nutzung dieser Kerne verfügbar haben. 2015 ist dies noch immer nicht besonders hoch, weshalb obwohl in der Konsumerserie "icore" von Intel die Zwi- und Vierkernprozessoren im Verkauf dominieren, obwohl bis zu 6 echte und acht virtuelle Kerne verfügbar sind. In Servern legten die Prozessoren dagegen an Kernen zu. 2014 haben die stärksten Xenon Prozessoren 36 Kerne, die Zusatzkarte mit dem Xeon-Phi Prozessor sogar 48 Kerne.

Die typischen Server oder Großrechner haben damit keine Probleme. Server sind von sich aus auf das Bedienen von mehreren Anwendern ausgerichtet und verteilen diese dann einfach auf die Prozessoren und Großrechner haben schon vor Jahrzehnten mehrere Prozessoren eingesetzt und das Betriebssystem und alle Compiler unterstützen den Anwender in der Programmierung und Verteilung einer Anwendung auf mehrere Prozessoren. So verwundert es nicht das Hersteller dieser Rechner Multiprozessorkerne als erste vorgestellt haben.

Erstaunlicherweise finden Dual Prozessorcores sehr schnell Anklang in der Embedded Welt. Die Hersteller von eingebetteten Prozessoren sind sonst konservativ was die Übernahme von PC Merkmalen angeht. Das resultiert aus den Anwendungen und dem viel größeren Preisdruck in diesem Segment. Doch schon im zweiten Halbjahr wird es einen vierfach Kern von ARM geben. Der Grund liegt darin, dass man natürlich so recht einfach die Leistung steigern kann. Da die Software bei Embedded Prozessoren fest in einem ROM vorliegt und nur vom Hersteller, nicht aber vom Anwender verändert werden kann ist es möglich die Kerne optimal auszunutzen. Weiterhin haben Embdded Prozessoren der höheren Leistungsklasse um die es hier geht oft die Aufgabe Datenströme auf die immer gleiche Art zu verarbeiten wie z.B. Signale von Sensoren oder die Dekodierung/Kodierung von MPEG Daten. Diese Aufgaben sind sehr gut parallelisierbar.

Der Cell Weg

IBM fertigt nicht nur den Power PC, sondern im Auftrag von Sony für die Playstation 3 den Cell Prozessor. Alle anderen Prozessoren die auf dieser Seite vorgestellt werden sind gedacht für universell einsetzbare Computer. Ein Prozessor kann in einem Server landen oder in einem Office PC oder einem Game PC. Eine Spielkonsole hat dagegen nur einen Zweck: Man will mit ihr spielen und ein Prozessor muss Grafiken schnell und in guter Qualität darstellen können. (Wenn heute eine Spielkonsole auch geeignet ist im Internet zu surfen oder DVD's abzuspielen, so ist dies zwar eine weitere Anwendung, aber dazu braucht man wenig Rechenleistung). Schon immer wurden spezielle Versionen von Prozessoren für Spielekonsolen gefertigt. Doch der Cell Prozessor ist ein Prozessor der speziell auf die Erfordernisse einer Spielkonsole ausgelegt ist.

Er besteht aus einem normalen 64 Bit Power PC Kern der zwei Threads parallel bearbeiten kann mit 512 KByte L2 Cache. Dazu gesellen sich 8 Kerne die nur Fliesskommaberechnungen durchführen können. Jeder mit einem Cache von 256 KB. Sie haben jeweils 128 Register von 128 Bit breite. Da eine Fliesskommaoperation (zumindest bei der ersten Generation) nur in 32 Bit (einfacher Genauigkeit) möglich ist, werden bei einem Takt 4 Einzelwerte gleichzeitig bearbeitet. Es handelt sich also um eine SIMD Einheit. Der 64 Bit Kern ist verantwortlich für die Ausführung von normalem Code und Programmen. Fliesskommarechnungen delegiert er an die 8 SIMD Einheiten.

Angebunden sind die 8 Einheiten und der Power PC Kern an einen gemeinsamen Bus, der pro Takt 96 Byte transportiert. Die maximale Datenmenge die ein einzelner Kern pro Takt laden kann sind 16 Byte. Unter optimalen Bedingungen, d.h. sehr gut parallelisierbarem Code erreicht jede Einheit 25.6 GFlops bei 3.2 GHz (entsprechend 8 Rechenoperationen pro Takt). Ein Cell Prozessor insgesamt dann etwa 200 GFlops und damit in etwa auf die achtfache Rechenleistung eines gleich hoch getakteten Pentium 4. Im Linpak Benchmark wurden 156 GFlops gemessen.

Man erkennt hier die die Anforderungen einer Spielekonsole. Da es Parallelen zu Grafikprozessoren gibt. Auch diese haben sehr viele (8-16 im Jahre 2005) Shader Einheiten die jeweils einen Teil eines Bildes bearbeiten. Genauso ist bei einer Spielkonsole die Berechnung der Bildpunkte, das Überziehen mit Texturen und das Versehen von Lichtreflexen für jeweils 8 Bildpunkte jeweils an eine Recheneinheit delegierbar. Der Power PC Kern ist dagegen für die Logik des Spieles zuständig, Das die Berechnungen nur in einfacher Genauigkeit (7 signifikante Stellen) durchgeführt werden ist bei einem Spiel irrelevant.

IBM will auf Basis des Cell Prozessors auch Server anbieten. Bei der im wissenschaftlichen Bereich geforderten doppelten Genauigkeit sinkt allerdings die Rechenleistung rapide auf 9.6 GFlops ab. Für verschiedene Anwendungen bei denen auch vornehmlich visualisiert wird (wie Strömungen oder Verformungen wiederzugeben) recht allerdings die einfache Genauigkeit. Für die nächste Generation des Cell Prozessors ist aber eine Erweiterung auf doppelte Genauigkeit angekündigt.

Schon 2003 hatten Forscher experimentell 70 Playstation 2 über ein Netzwerk zu einem Supercomputer von einem Halben Teraflop Leistung zusammengeschaltet. Damit wurde bewiesen, dass man die Fliesskommaeinheiten von Spielkonsolen für "echte" Supercomputer nutzen kann. Die praktische Umsetzung scheiterte aber an dem kleinen 32 MB Speicher der Playstation 2. Immerhin war es ein preiswerter Supercomputer. Er kostete nur 500.000 Dollar. Im Vergleich zu den 6.5 GFlop schnellen Einheit der Playstation verfügt der Cell Prozessor aber über die 14 fache Leistung.

Die Idee sehr einfache Prozessoren massiv zu parallelisieren ist nicht neu. Die Firma Rapport hat einen Prozessor aus 1025 Kernen hergestellt. Davon ist eine ein Power PC Kern. Die restlichen 1024 Kerne arbeiten nur mit 8 Bit Wortbreite - aber durch ihre Zahl besitzen sie eine sehr hohe Performance. Sie soll 10 mal schneller HDTV verarbeiten als existierende Prozessoren. Die Vorgängerversion KC256 war mit 125 MHz getaktet, hatte 256 Kerne und eine Datenbusbreite von 32 GByte/sec.

Schon 2001 hatte die Firma PACT einen Prozessor aus 128 ALU's angekündigt. Die Firma fertigt heute verschiedene Spezialprozessoren für Das Verarbeiten von Datenströmen.

Der Itanium Weg

ItaniumEinen Ausweg dem Dilemma, Code für einen Prozessor auf mehrere Funktionseinheiten verteilen zu müssen, schien Intel mit dem Itanium Prozessor gefunden zu haben. Dieser verfügt über sehr viele Funktionseinheiten: 4 Integer, 2 FPU, 2 SIMD, 4 Multimedia 3 Sprung und 2 Ladeeinheiten. 6 Befehle können von diesen parallel bearbeitet werden. Damit die Befehle auf diese optimal verteilt werden können, hat man ein schlaues Konzept erarbeitet: Kleinste Einheit ist nicht ein einzelner Maschinenbefehl, sondern eine Gruppe von 3 Befehlen.

Der Code besteht aus 128 Bit langen Befehlsbündeln. Jedes Bündel besteht aus bis zu 3 Befehlen von 41 Bit Breite und einem 5 Bit "Template", dass angibt ob, und wenn ja wie, die Befehle parallel ausgeführt werden können und ob es Abhängigkeiten zu anderen Befehlen gibt. Sollte keine parallele Ausführung möglich sein, so müssen die Bündel mit NOP (Leerbefehlen) gefüllt werden, da Abhängigkeiten den Prozessor sehr stark ausbremsen. Dies wäre z.B. bei drei Fliesskommabefehlen so. Der Code ist dadurch dreimal größer als bei Pentium Systemen. Wo aber die Einheiten gut bedient werden können, ist der Prozessor auch sehr schnell.

Das wesentliche an der dieser Idee ist es, dass es die Verantwortung auf den Compiler auslagert. Das ist sinnvoll, denn dieser hat die Quellen des Codes und kann bei der Erzeugung schon wissen, wie die Befehle effektiv zu gruppieren sind. Er kennt auch die Abhängigkeiten und setzt die Templates Bits. Zudem wird ein Programm einmal compiliert, aber tausende Male ausgeführt - Eine Optimierung bei der Kompilierung ist daher immer insgesamt zeitsparender.

In der Theorie ist dieses Verfahren genial: Man gibt dem Compiler, der ja viel besser als der Mikroprozessor wissen muss, wie man Befehle am besten gruppiert die Freiheit dies für den Prozessor zu erledigen. Man könnte so viel Logik auf dem Prozessor einsparen und eine optimale Geschwindigkeit erreichen.

In der Praxis sieht das Ergebnis anders aus. Zwar ist der Itanium Prozessor sehr schnell bei den Fliesskommarechnungen (Durch eine 128 Bit FPU, in der zwei 64 Bit Fliesskommazahlen gleichzeitig bearbeitet werden können). Doch bei den Integer Werten ist die Performance eher Mittelmaß. Vor allem aber ist der Prozessor extrem teuer und dies ist wiederum so, weil der Prozessor sehr viel L3 Cache auf dem Chip hat (1.5 - 6 MB im Juni 2004 je nach Version). Erst mit dem starken Cacheausbau (Vom Itanium zum Itanium 2) erreichte der Prozessor die geplante Geschwindigkeit. Intel hofft, das sie Vorzüge der Architektur in zukünftigen Versionen des Prozessor besser zur Geltung kommen, doch bis dahin wird es auch neue Konkurrenz geben. Warum Intel allerdings den kleinen L1 Cache nicht erweitert hat, was wesentlich weniger Transistoren benötigt wird wohl ein Rätsel bleiben. Zum Zeitpunkt der Erstellung dieses Artikels (Juli 2004) konnte Intel jedoch noch keinen nennenswerten Marktanteil im angepeilten Marktsegment der Server und Clustersysteme erobern, obwohl der Prozessor schon seit 2 Jahren auf dem Markt ist.

In der Grundidee ähneln die Prozessoren auf Grafikkarten dem Itanium, zumindest was das Bündeln sehr vieler Funktionseinheiten angeht. Auch hier gibt es mehrere Shader, Pixel Pipelines und Renderer, die aber an einem gemeinsamen Bus liegen. Der Hersteller bietet dann häufig mehrere Preisklassen an die sich in der Anzahl dieser Einheiten unterscheiden bei gleichem Kern und gleichen DirectX Fähigkeiten.

GPU

Viel mehr Kerne als Prozessoren haben GPUs, die Grafikprozessoren. Die Einheiten die Flächen einfärben oder mit Texturen überziehen, die Schatten und Licht berechnen sind relativ einfache Prozessorkerne ohne Cache und mit beschränktem Befehlssatz. Schon früher hatten sie einfach aufgrund ihrer großen Zahl (selbst einfache Grafikkarten haben über 100 Einheiten, die leistungsstärksten 2015 über 1000 Recheneinheiten eine theoretisch hohe Fließkommaleistung, aber in der Praxis war diese nicht nutzbar. Programme durften nur klein sein, die Programmierung der GPU war aufwendig und kompliziert. Vor allem aber brachen sie bei den im wirklichen Leben benötigten "doppelt-genauen" Zahlen stark in der Leistung ein, teilweise auf ein Zehntel der Leistung bei einfach genauen Zahlen. Einfach genaue Zahlen haben nur 7 signifikante Stellen, das bedeutet wenn man dies auf Beträge bezieht gibt es schon einen Fehler wenn man zwei Zahlen addiert die im Bereich von 100.000 bis 1 Million liegen. Sie spielen daher in naturwissenschaftlich-technischen Berechnungen keine Rolle.

Sowohl ATI wie auch NVidia die beiden großen Herstellern von Grafikkarten haben in den letzten Jahren hier nachgebessert und zum einen die mangelnde Fließkommaleistung von GPUs verbessert, zum anderen sind diese heute leistungsfähiger und leichter zu Programmieren, es gibt auch eine Schnittstelle CUDA zum Nutzen der Grafikkarten-GPU. Inzwischen werden spezielle Beschleunigerkarten die gar keine Grafik berechnen sollen und auch keine Monitor Anschlüsse haben als Coprozessor verkauft und haben in den leistungsfähigsten Supercomputern Einzug gehalten. Privatanwender können die GPU bei manchen Programmen nutzen wie Bildbearbeitung oder Videoverarbeitung.


© des Textes: Bernd Leitenberger. Jede Veröffentlichung dieses Textes im Ganzen oder in Auszügen darf nur mit Zustimmung des Urhebers erfolgen.

Zum Thema Computer ist auch von mir ein Buch erschienen. "Computergeschichte(n)" beinhaltet, das was der Titel aussagt: einzelne Episoden aus der Frühzeit des PC. Es sind Episoden aus den Lebensläufen von Ed Roberts, Bill Gates, Steve Jobs, Stephen Wozniak, Gary Kildall, Adam Osborne, Jack Tramiel und Chuck Peddle und wie sie den PC schufen.

Das Buch wird abgerundet durch eine kurze Erklärung der Computertechnik vor dem PC, sowie einer Zusammenfassung was danach geschah, als die Claims abgesteckt waren. Ich habe versucht ein Buch zu schreiben, dass sie dahingehend von anderen Büchern abhebt, dass es nicht nur Geschichte erzählt sondern auch erklärt warum bestimmte Produkte erfolgreich waren, also auf die Technik eingeht.

Die 2014 erschienene zweite Auflage wurde aktualisiert und leicht erweitert. Die umfangreichste Änderung ist ein 60 Seiten starkes Kapitel über Seymour Cray und die von ihm entworfenen Supercomputer. Bedingt durch Preissenkungen bei Neuauflagen ist es mit 19,90 Euro trotz gestiegenem Umfang um 5 Euro billiger als die erste Auflage. Es ist auch als e-Book für 10,99 Euro erschienen.

Mehr über das Buch auf dieser eigenen Seite.

Hier geht's zur Gesamtübersicht meiner Bücher mit direkten Links zum BOD-Buchshop. Die Bücher sind aber auch direkt im Buchhandel bestellbar (da ich über sehr spezielle Themen schreibe, wird man sie wohl kaum in der Auslage finden) und sie sind natürlich in den gängigen Online-Plattformen wie Amazon, Libri, Buecher.de erhältlich.

Sitemap Kontakt Impressum / Datenschutz Neues Hier werben / advertisment here Buchshop Bücher vom Autor Top 99