Gleitkommaeinheit

Gleitkommaeinheit, FPU (für Floating-Point Unit) oder NPU (für Numeric Processing Unit) sind Begriffe aus der Computertechnik und bezeichnen einen speziellen Prozessor, der Operationen auf Gleitkommazahlen ausführt.
Allgemeines
[Bearbeiten | Quelltext bearbeiten]
Wenn ein Computer Gleitkommaoperationen ausführen soll, gibt es zwei prinzipielle Möglichkeiten:
- Software-Emulation der Funktionen durch die CPU, z. B. unter Verwendung von Gleitkomma-Libraries
- Auslagerung der Operationen in einen dedizierten Koprozessor
Frühe CISC-Prozessoren verfügten meist nicht über eingebaute Mechanismen zur Behandlung von Gleitkommazahlen. Gleitkommaberechnungen und mathematische Funktionen wurden per Software durch den Hauptprozessor erledigt. Dies beansprucht einerseits Rechenleistung im Hauptprozessor und ist andererseits erheblich langsamer als eine spezialisierte Hardwarelösung. Da derartige spezialisierte Koprozessoren vorwiegend komplexere Operationen wie Multiplikation, Division oder Wurzelziehen und transzendente Funktionen durchführen, werden sie auch „mathematische Koprozessoren“ genannt.
Bei CISC-Mikroprozessoren konnten die Systeme dann teilweise mit zusätzlichem Koprozessor ausgerüstet werden. Das waren z. B. von AMD der AM9511 bzw. AM9512 (lizenziert von Intel als Intel i8231 bzw. i8232), die als periphere Bausteine angesprochen wurden. Bei späteren CISC-CPUs wie den Intel x86-Prozessoren (bis zum 486er) oder den Motorola-68k-CPUs gab es oft die Möglichkeit, einen Koprozessor direkt auf dem Motherboard nachzurüsten. Dies waren insbesondere die Koprozessoren von Intel 8087, 80287, 80387 und 80487 oder auch Weitek Abacus 3167[1]. Für die 68k-CPUs von Motorola sind das 68881 und 68882.
Bei RISC-Computern ist ein mathematischer Koprozessor oft von vorneherein Teil des Gesamtsystems und daher vorinstalliert, vor allem auch, da solche Geräte bevorzugt in Anwendungsbereichen mit umfangreichen Berechnungen benutzt worden sind (CAD, CAM, CIM, 3D-Grafik). Jedoch sind auch hier zunächst CPU und FPU oft zwei getrennte Bausteine. So verwendet der IBM RT-PC eine NS32081 FPU oder Motorolas 68881. Frühe Sun SPARC Systeme benutzen Weitek 1164/1165 oder Texas Instruments 8847 als FPU. Dagegen kommen MIPS Systeme oft mit ihrer vordefinierten CPU/FPU Kombination, als 2000/2010 oder 3000/3010. ARM Systeme können mit einer FPA-10 FPU ausgerüstet werden.[2] Ausnahmen davon sind Clipper C100, der von Anfang mit integrierter FPU versehen war, sowie auch Motorola 88k.
Mit fortschreitender Integration wurden die FPUs in die CPU integriert (z. B. Intel Pentium oder PA-RISC PA-7100).
Eingeläutet wurde das Zeitalter der integrierten FPUs durch mehrere Faktoren:
- In CPUs integrierte Caches sind unvereinbar mit externen FPUs.
- Mathematische Funktionen wurden zunehmend in „normalen“ Applikationen verwendet, z. B. im Rendern von Zeichensätzen.
- Gatterfunktionen wurden zunehmend preiswerter, Sockel und Steckverbinder eher teurer.
Teils wurden zu Punkt 1 auch kreative Lösungen erdacht: Intels letzte eigenständige Gleitkommaeinheit, der externe Coprozessor i487, war tatsächlich eine modifizierte vollständige 80486DX-CPU. Diese hatte, im Gegensatz zum 80486SX, eine Gleitkommaeinheit eingebaut. Die Modifikation des Coprozessors bestand in Form eines zusätzlichen Steuerpins und einer künstlichen Sperre, die den Eigenbetrieb verhinderte. Setzte man den Coprozessor ein, so wurde die SX-CPU deaktiviert.[3]
Funktionsweise und Aufbau
[Bearbeiten | Quelltext bearbeiten]
Das Vorhandensein einer FPU ermöglicht eine erhebliche Leistungssteigerung für gleitkommaintensive Berechnungen. Zudem boten Koprozessoren breitere Register: Schon bei 16- und 32-Bit-CPUs hatte die FPU häufig 64 Bit, 80 Bit oder auch 128 Bit breite Register. Dadurch konnten Berechnungen mit höherer Genauigkeit durchgeführt werden, und es wurde ein größerer Wertebereich abgedeckt. Da auch die FPU im Inneren letztendlich eine digitale Recheneinheit darstellt, bedarf es weiterer trickreicher Methoden, um eine echte Beschleunigung zu erhalten. Viele Modelle (etwa der 8087) verfügen über hardwareseitig optimierte Rechenmethoden wie z. B. den CORDIC-Algorithmus für trigonometrische Funktionen, welcher nur durch Addition und Registerverschiebung, aber ohne langwierige Multiplikation auskommt. Oft wird eine große Beschleunigung auch über fest implementierte Lookup-Tabellen erreicht. Dabei werden die Werte nicht über mehrmalige Schleifendurchläufe ermittelt, sondern zuerst mit Hilfe von Tabellen näherungsweise und dann durch Interpolationsverfahren bis zu hinreichender Genauigkeit bestimmt. Ein Fehler in einer solchen Tabelle war Ursache des sogenannten Pentium-Bug.
Weiterhin kann eine FPU ihre Register oftmals als Matrix organisieren und so Vektorrechnungen beschleunigen.
Die meisten FPUs stellen Operationen für die Grundrechenarten (mit höherer Genauigkeit als die CPU), Logarithmus-, Wurzel- und Potenzrechnung und trigonometrische Funktionen sowie Funktionen für das Rechnen mit Matrizen zur Verfügung.
Die Rechenleistung einer FPU wird meistens in SPECfp gemessen, im Gegensatz zu den SPECint einer CPU.
Nachfolge
[Bearbeiten | Quelltext bearbeiten]In den allermeisten Fällen werden Gleitkomma-Berechnungen seit x86_64 in SSE- bzw. SSE2-Befehlen erledigt.[4][5] Das liegt zum einen daran, dass seit AMD64 von 2003 davon auszugehen ist, dass jeder 64-Bit-x86-Prozessor SSE2 bietet. Zum anderen liegt es aber auch an der Umsetzung von x87 vs. jener der x86-SIMD-Erweiterungen (neben SSE auch AVX): x87 erfordert, dass die Daten über den Stack verarbeitet werden, was zur Folge hat, dass das Hin- und Herschieben der Daten zum und vom Stack oft länger dauert als die Berechnung selbst; SSE bis SSE4.2 und AVX hingegen sind Register-basiert.[6]
Siehe auch
[Bearbeiten | Quelltext bearbeiten]Einzelnachweise
[Bearbeiten | Quelltext bearbeiten]- ↑ https://cpu-collection.de/?l0=cl&l1=FPU&l2=Weitek
- ↑ https://chrisacorns.computinghistory.org.uk/docs/GECPlessey/GECPlessey_FPA10DataSheet.pdf
- ↑ Dictionary.com - Intel 487SX ( vom 16. März 2012 im Internet Archive)
- ↑ Wasil Zafar: x86 Assembly Series Part 11: Floating-Point & x87/SSE. (Blog) 6. Februar 2026, abgerufen am 31. Mai 2026 (englisch): „Compiler Default: Modern compilers (GCC, Clang, MSVC) default to SSE for floating-point. x87 is only used when explicitly requested (
-mfpmath=387) or for 80-bitlong double.“ - ↑ Clang Compiler User’s Manual. In: Clang 23.0.0git documentation. Abgerufen am 31. Mai 2026 (englisch): „-fexcess-precision: … Clang does not use excess precision arithmetic for most types or on most targets. For example, even on pre-SSE X86 targets where float and double computations must be performed in the 80-bit X87 format, Clang rounds all intermediate results correctly for their type.“
- ↑ O. Lawlor: Three Generations of x86 Floating-Point Numbers: FPU, SSE, and AVX. (Vorlesung) In: 2011 CS 301 – Assembly Language. University of Alaska Fairbanks, 2011, abgerufen am 31. Mai 2026 (englisch): „Generation 1: ‘FPU Register Stack’ … This implementation worked reasonably OK for many years, but the restriction that you can only operate on the top of the stack makes it cumbersome for compilers to generate the code for big arithmetic intensive functions--lots of instructions are spent shuffling values around in the stack rather than doing work.
Generation 2: SSE – Intel realized that a more conventional register-based implementation could deliver higher performance, so in the late 1990's they built an entirely separate replacement floating point unit called SSE.“
Weblinks
[Bearbeiten | Quelltext bearbeiten]- Großes INTEL CPU/FPU Archiv – Viele Bilder und Infos
- AMD64 Architecture Programmer’s Manual Volume 5: 64-Bit Media and x87 Floating-Point Instructions ( vom 8. März 2014 im Internet Archive) (Memento vom 8. März 2014 im Internet Archive; englisch; PDF-Datei; 1,38 MB)