Techtalk: Schnellere Rechner trotz geringerer Taktfrequenzen

ml, den 11. November 2007
Macnotes - Logo
Macnotes – Logo

Wer die großen Prozessorhersteller und ihre Produkte in den letzten Jahren aufmerksam verfolgt hat, der konnte dabei einen Wandel feststellen: während der Pentium 4 vor etwa 4 Jahren bereits mit Taktfrequenzen jenseits von 3GHz lief, arbeiten heute die meisten Standardprozessoren weit unter dieser Marke.

Dass die Prozessoren trotzdem nicht langsamer geworden sind, liegt an unterschiedlichen Dingen. Der folgende Artikel gibt einen Überblick über Technologien und Maßnahmen, mit denen die Geschwindigkeit von Rechnern ohne die Erhöhung der Taktrate gesteigert wird.

Parallelität

Auf einem heutigen System laufen viele Aufgaben scheinbar parallel ab. Ein Blick in die Aktivitätsanzeige von Mac OS X offenbart eine Vielzahl an Prozessen, die quasi alle zur selben Zeit laufen. Auf einem Single-Prozessorsystem wird diese Parallelität durch ein Zeitmultiplexverfahren realisiert. Die zur Verfügung stehende Rechenzeit wird in kurze Abschnitte aufgeteilt und jeweils ein Abschnitt wird einem Prozess zugewiesen. Mit Hilfe von Prioritäten kann ein Prozess mehr oder weniger Rechenzeit zugewiesen bekommen.

SMP, SMT und Hyperthreading

Hinter der Abkürzung SMP versteckt sich der Begriff Symmetric Multiprocessing. Gemeint ist damit, dass mehrere gleichartige Prozessoren parallel in einem System verwendet werden. Multicore-Prozessoren sind eine Implementierung von SMP. In einem älteren Artikel hatten wir bereits einmal die Gründe für und die Vorteile von Multicore-Prozessoren erläutert.

Während bei SMP die Anzahl der Prozessoren dupliziert wird, werden bei SMT-fähigen Prozessoren (Simultaneous Multithreading) einzelne Komponenten (Pipeline, Register und Rechenwerke) des Prozessors dupliziert. Damit kann ein Prozessor mehrere Threads echt-parallel ausführen. SMT ist einfacher aber weniger leistungsfähig als SMP. Die Idee hinter SMT ist vereinfacht ausgedrückt die, dass Rechenwerke, die mehrmals vorhanden sind, parallel von unabhängigen Threads ausgelastet werden können.

Der bekannteste Prozessor mit SMT-Architektur dürfte Intels Pentium 4 mit Hyperthreading sein. Gegenüber einem Betriebssystem gibt sich ein SMT-fähiger Prozessor meist als zwei Prozessoren aus.

Nachdem Hyperthreading bei Intel mit dem Ende des Pentium 4 erstmal wieder verschwand, wird es wahrscheinlich mit der übernächsten Prozessorgeneration Nehalem wieder Einzug halten. Neben Intel verwenden IBM und Sun SMT-Techniken in einigen ihrer Prozessoren.

Der Grund für solche Architekturen ist, dass man auf Prozessorebene die Parallelität von Aufgaben ausnutzen möchte. Bislang sequentiell ablaufende Aufgaben können damit parallel ausgeführt werden. Solche Architekturen stellen erhöhte Anforderungen an Softwareentwickler, denn diese müssen ihre Programme anpassen und z. B. Daten mit geeigneten Synchronisationsmechanismen vor wechselseitigem Zugriff schützen.

Architektur

Großes Potential bei der Verbesserung von Prozessoren ohne die Taktraten zu steigern liegt in der Prozessorarchitektur. Optimierte Rechenwerke sind z. B. in der Lage Berechnungen schneller auszuführen.

Ein großer Bremsklotz bei heutigen Architekturen ist die hohe Latenz zwischen Prozessor und Hauptspeicher. Im Vergleich zur Prozessorgeschwindigkeit ist die Geschwindigkeit des Hauptspeichers um ein Vielfaches geringer. Dieses Manko versucht man mit Caches zu umgehen. Im L2-Cache werden besonders häufig benötigte Daten zwischengespeichert. Eine Möglichkeit also die Verarbeitungsgeschwindigkeit zu steigern, ist es die Größe von Caches zu erhöhen. Je größer der Cache, desto mehr Daten können darin vorgehalten werden und müssen nicht aus dem Hauptspeicher geladen werden. Intels nächste Prozessorgeneration Penryn wird mit L2-Caches mit bis zu 6 MB Größe aufwarten.

Um die Anzahl der Zugriffe auf den Hauptspeicher zu reduzieren, wird ebenfalls die Anzahl der auf dem Prozessor verfügbaren Register erhöht. Während die klassische x86-Architektur nur über 8 frei verfügbare Register verfügte, sind es für die 64-Bit-Erweiterung 16.

Bei der Abarbeitung eines Programms kommt es zu vielen Programmsprüngen und Verzweigungen im Code, die aus Bedingungen resultieren, die der Programmierer formuliert hat. Springt die Ausführung eines Programms an eine neue Stelle, dann muss ggf. erst der Programmcode aus dem Hauptspeicher geladen werden. Um die an dieser Stelle auftretenden Latenzen zu vermeiden, verfügen moderne Prozessoren über eine sog. Branch-Prediction. Diese Einheit versucht Sprünge im Programmcode möglichst präzise vorherzusagen und lädt dann parallel zur aktuellen Ausführung bereits die neuen Codeteile aus dem Speicher.

Der Programmierer kann mit speziellen Compilerhinweisen bewirken, dass der Compiler den Programmcode so strukturiert, dass die Branch-Prediction eine besonders hohe Trefferquote erzielen kann. Im von Apple favorisierten GCC gibt es dazu die Makros EXPECT_TRUE() und EXPECT_FALSE(). Mit diesen Hinweisen kann der Compiler den Programmcode für den allgemeinen Fall optimieren.

Eine weitere Möglichkeit die Rechengeschwindigkeit zu steigern sind Spezialrecheneinheiten. Unter dem Namen Altivec (PowerPC) und SSE (Intel) haben die Prozessorhersteller spezielle Vektorrecheneinheiten in ihre Prozessoren integriert. Diese Einheiten arbeiten nach dem sog. SIMD-Prinzip. SIMD steht für „Single Instruction Multiple Data“ und das bedeutet, dass eine Rechenoperation auf einen ganzen Datenstrom angewendet wird. Dies ist z. B. bei der Video- oder Musikkomprimierung interessant, da spezielle Instruktionen immer wieder auf unterschiedliche Daten angewendet werden.

Compiler

Großen Einfluss auf die Geschwindigkeit haben Compiler. Sie übersetzen den vom Programmierer in einer Programmiersprache verfassten Programmtext in ein ausführbares Programm. Compiler haben großen Einfluss darauf, wie effektiv die Rechenwerke und Register des Prozessors ausgenutzt werden. Eine Technik, die alle gängigen Compiler beherrschen, ist das sog. Loop Unrolling. Mehrere Iterationen einer Schleife werden zusammengefasst und linear abgearbeitet. Dabei werden die Sprünge eingespart, die sonst am Ende jedes Durchlaufs den Programmzähler auf den Anfang der Schleife setzen. Der Nachteil ist, dass dadurch die Größe des Programmcodes anwächst und diese Technik daher für eingebettete Systeme ungeeignet ist.

Es gibt noch eine Vielzahl weiterer Möglichkeiten für Compiler den Programmcode zu optimieren. Doch das würde an dieser Stelle zu weit führen.

Betriebssystem

Für den Anwender kommt es letztlich darauf an, welche Geschwindigkeit bei ihm „ankommt“. An dieser Stelle kommt das Betriebssystem ins Spiel. Wie gut kann es die Möglichkeiten der Hardwarearchitektur ausnutzen und wie viel Performance wird vom Betriebssystem geschluckt.

An dieser Stelle kommen subjektive bzw. psychologische Faktoren mit ins Spiel. Lässt die Reaktion des Betriebssystems auf eine Anwenderinteraktion länger als 100 ms auf sich warten, so entsteht der Eindruck eines langsamen Systems. Deshalb sollte man Dialoge mit Fortschrittsbalken möglichst sofort anzeigen. Reaktionen auf Mausklicks sollten zudem sofort erfolgen. Wie wichtig das ist, zeigte sich 2001 bei der Veröffentlichung von Mac OS X 10.0. Die neue Aqua-Oberfläche war so unglaublich träge, dass die Menschen das Gefühl hatten, ihr Rechner läuft gegenüber Mac OS 9 mit angezogener Handbremse. Dabei zeigten alle Benchmarks, dass das neue System schneller als das alte war. Mit Version 10.1 spendierte Apple der Oberfläche deutlich mehr Geschwindigkeit und sofort hatte man den Eindruck vor einem neuen Rechner zu sitzen.

Ein weiterer Punkt, bei dem der Betriebssystemhersteller Einfluss auf die Geschwindigkeit (s)eines Systems hat, ist durch die Bereitstellung von Bibliotheken. Ein großes Unternehmen hat häufig mehr Ressourcen und besseren Zugang zu Architekturdetails und das hilft optimierte Algorithmen mit Hilfe von Bibliotheken anzubieten. Entwickler, die diese Bibliotheken benutzen, profitieren davon und können sich auf ihre eigentliche Aufgabe konzentrieren. Apple hat es an dieser Stelle zu einer gewissen Perfektion gebracht. Das Accelerate-Framework (unter /System/Library/Frameworks) unterstützt sowohl die PowerPC- als auch die Intel-Architektur. Ein Entwickler muss sich also nicht mit unterschiedlichen Optimierungen für zwei Architekturen beschäftigen, sondern kann einfach die Bibliothek von Apple nutzen.


Ähnliche Nachrichten