Kannst du erklären, wie Computer von Grund auf funktionieren?
Um Computer zu verstehen, musst du zuerst eine physikalische Realität akzeptieren. In einem Computer gibt es keine Magie. Nur elektrische Signale. Genauer gesagt: nur hohe und niedrige Spannungen.
Das Grundmaterial für die Chips, die wir heute verwenden, ist Silizium. Silizium ist ein Halbleiter. Halbleiter haben eine physikalische Eigenschaft: durch Dotieren mit verschiedenen Elementen und Steuern der Spannung an der Elektrode kann man bestimmen, ob sie Strom leiten oder nicht. Diese winzige Struktur, die durch Elektrizität ein- und ausgeschaltet werden kann, nennt man Transistor.
Moderne CPUs enthalten Dutzende Milliarden Transistoren. TSMCs aktueller 3-Nanometer-Prozess bedeutet, dass diese Transistoren so unglaublich klein hergestellt werden, dass Dutzende Milliarden auf ein fingernagelgroßes Stück Silizium passen.
Du musst dir nur eine Kernfunktion des Transistors merken. Wenn du an seinen Steueranschluss eine hohe Spannung anlegst, leitet er. Bei einer niedrigen Spannung sperrt er. Das ist die grundlegende physikalische Realität. Wir definieren hohe Spannung als logische 1 und niedrige Spannung als logische 0. Die gesamte Informatik baut auf diesen beiden Zuständen auf.
Mit Transistoren können wir Logikgatter kombinieren.
Angenommen, wir schalten zwei Transistoren in Reihe. Strom kann nur von einem Ende zum anderen fließen – und eine 1 ausgeben – wenn beide Steueranschlüsse eine hohe Spannung erhalten, also beide Eingänge 1 sind. Wenn einer 0 ist, wird der Strom unterbrochen und der Ausgang ist 0. Diese physikalische Schaltung nennen wir UND-Gatter.
Nach derselben Logik: Wenn zwei Transistoren parallel geschaltet sind, fließt Strom – und gibt eine 1 aus – solange mindestens ein Eingang 1 ist. Nur wenn beide 0 sind, ist der Ausgang 0. Das ist ein ODER-Gatter.
Mit einer etwas anderen Verbindungsmethode, bei der Eingabe 1 eine Ausgabe 0 und Eingabe 0 eine Ausgabe 1 ergibt, erschaffen wir ein NICHT-Gatter.
Mit UND-, ODER- und NICHT-Gattern betritt die physikalische Welt offiziell die mathematische Welt. Ich empfehle hier ein klassisches Lehrbuch: Code von Charles Petzold. Dieses Buch hat kein überflüssiges Beiwerk – es beginnt mit dem Telegrafen und erklärt, wie man Logikgatter verdrahtet. Es ist perfekt, um diese erste Ebene des physikalischen Verständnisses aufzubauen. Du solltest es dir nach diesem Beitrag ansehen – es wird dich umhauen.
Da wir nun Logikgatter haben, wie bringen wir einen Computer zum Addieren?
Im Binärsystem ergibt 1 plus 1 gleich 10. Das bedeutet, das aktuelle Bit wird zu 0, und wir übertragen 1 zur nächsten Position. Das sind eigentlich zwei logische Operationen. Erstens: Bestimme das aktuelle Bit: Wenn beide Eingänge 1 sind, ist das aktuelle Bit 0. Wenn ein Eingang 1 und der andere 0 ist, ist das aktuelle Bit 1. Diese Logik kann durch Kombinieren der grundlegenden Gatter implementiert werden – wir nennen es ein XOR-Gatter. Zweitens: Bestimme den Übertrag: Nur wenn beide Eingänge 1 sind, erfolgt ein Übertrag, was genau die Funktion des UND-Gatters ist.
Verbinde ein XOR-Gatter und ein UND-Gatter, und du hast physikalisch die Addition einer einzelnen Binärziffer implementiert. Das nennt man einen Halbaddierer. Schalte mehrere Halbaddierer in Kaskade, verarbeite das Übertragssignal, und du erhältst einen Volladdierer. Wenn du 64 solcher Volladdierer verbindest, erhältst du eine physikalische Schaltung, die 64-Bit-Binärzahlen addieren kann.
Wenn du die Codezeile a = b + c schreibst, passiert auf der untersten Ebene Folgendes: Die elektrischen Signale, die b und c repräsentieren, strömen gleichzeitig in diese aus Zehntausenden von Transistoren bestehende Addierschaltung. Nach einer extrem kurzen physikalischen Verzögerung gibt das andere Ende der Schaltung stabile hohe und niedrige Spannungen aus, die das Ergebnis darstellen.
Das ist die sogenannte Arithmetisch-logische Einheit (ALU). Sie ist überhaupt kein mysteriöses Kernbauteil – sie ist nur ein dichtes Netz aus Halbleiter-Logikgattern, die nach von Menschen entworfenen mathematischen Regeln fest verdrahtet sind. Neben Addition kann sie durch unterschiedliche Verdrahtungskonfigurationen auch Subtraktion, Bitverschiebungen und sogar Multiplikation durchführen.
Aber nur addieren zu können, ist nutzlos. Das Ergebnis ist nur ein Haufen elektrischer Signale – sobald der Strom ausfällt oder sich die Eingabe ändert, verschwindet das Ergebnis. Ein Computer muss Daten speichern können. Das bringt uns zu Speicher und Registern.
Wie verwendet man elektrische Signale, um einen Zustand zu speichern? Elektronikingenieure haben eine äußerst raffinierte Schaltung erfunden, das Flip-Flop. Es ist eine Logikgatterschaltung mit einer Rückkopplungsschleife. Einfach ausgedrückt wird das Ausgangssignal zurück zum Eingang geführt. Dieses Design ermöglicht es der Schaltung, auch nach dem Entfernen des ursprünglichen Eingangs ihren aktuellen hohen oder niedrigen Spannungszustand durch interne Rückkopplung beizubehalten.
Wenn du diesem Flip-Flop ein bestimmtes Schreibsignal gibst, aktualisiert es seinen internen Zustand und verriegelt ihn. Solange du kein weiteres Schreibsignal sendest, hält es diese 0 oder 1 unbegrenzt.
Ordne 64 Flip-Flops in einer Reihe an, und du kannst eine 64-Bit-Binärzahl speichern. Innerhalb der CPU, direkt neben der ALU, werden diese aus Flip-Flops bestehenden ultraschnellen Speichereinheiten Register genannt. Ihr physischer Standort ist direkt neben der Rechenschaltung, was bedeutet, dass das elektrische Signal die kürzestmögliche Strecke zurücklegt, weshalb sie extrem schnell sind. Natürlich sind sie auch extrem teuer in der Herstellung, daher können sie nur sehr klein sein.
Hier muss ich ein absolut legendäres Buch empfehlen: Computer Systems: A Programmer’s Perspective, in der IT-Welt besser bekannt als CSAPP. Es ist das Lehrbuch der Carnegie Mellon University. Das Besondere daran ist, dass es die Brücke von der Assemblersprache zur Hardware-Architektur und zu Betriebssystemen schlägt. Wenn du es verstanden hast, weißt du, warum mancher Code schnell und mancher langsam läuft – weil du anfängst, Code mit einem Denken auf physikalischer Ebene zu schreiben.
Wenn du noch weiter gehen und Betriebssysteme, Rechnerorganisation, Netzwerke und andere grundlegende Themen systematisch auf einmal durchdringen möchtest, habe ich eine Sammlung zusammengestellt, die Datenstrukturen und Algorithmen, Rechnerorganisation und mehr abdeckt.
Über 1 Million Downloads im gesamten Web – Grundlagen der Informatik, die deine Fähigkeiten auf die nächste Stufe heben.
Gehen wir weiter nach außen. Was ist, wenn Register nicht ausreichen? Wir brauchen größeren Speicher. Hier kommen die RAM-Riegel ins Spiel, die in dein Motherboard gesteckt werden. Der technische Name ist Dynamischer Direktzugriffsspeicher, DRAM.
Das physikalische Prinzip von DRAM unterscheidet sich völlig von dem der Register. Statt Flip-Flops verwendet es winzige Kondensatoren, um elektrische Ladung zu speichern. Ein Kondensator mit Ladung ist 1, ohne Ladung ist 0. Da die Kondensatorstruktur extrem einfach ist – nur ein Transistor und ein Kondensator pro Bit – kann die Kapazität sehr groß gemacht werden. Heutzutage sind Dutzende oder sogar Hunderte von Gigabytes üblich.
Aber Kondensatoren haben einen fatalen Nachteil: Sie verlieren Ladung. Wenn man sie in Ruhe lässt, verliert sich die Ladung, die die 1 repräsentiert, innerhalb von Millisekunden vollständig und wird zu 0. Daher muss das Motherboard eine spezielle Steuerschaltung haben, die die Daten aus dem Speicher liest und in extrem kurzen Abständen wieder auflädt. Das nennt man dynamische Auffrischung. Deshalb verschwindet alles im Speicher sofort, wenn du den Computer vom Strom trennst.
Jetzt haben wir eine ALU, die rechnen kann, und Register und Speicher, die Daten speichern können. Die Kernfrage ist: Wie fangen diese leblosen Dinge an, sich zu bewegen? Wer befiehlt ihnen, zuerst zu addieren, dann zu multiplizieren und schließlich das Ergebnis zu speichern?
Das ist die Aufgabe der Steuereinheit und der Kernmechanismus, der einen Computer zu einer Maschine macht.
Das Motherboard hat einen Quarzoszillator – einen Quarzkristall, der solange Strom anliegt, ein Impulssignal mit fester Frequenz erzeugt. Wenn deine CPU mit 4,0 GHz angegeben ist, bedeutet das, dass dieser Kristall 4 Milliarden Hoch-Niedrig-Spannungsübergänge pro Sekunde erzeugt.
Das ist der Herzschlag des Computers. Alle Logikgatter und Flip-Flops in der CPU arbeiten in strenger Synchronisation mit diesem Herzschlag.
In der CPU gibt es ein ganz besonderes Register, den Programmzähler. Er enthält nichts als eine Speicheradresse.
Wenn der erste Schlag des Herzschlags ertönt, macht die CPU das Erste: den Befehlsabruf. Sie sendet die im Programmzähler gespeicherte Adresse über die Leiterbahnen auf dem Motherboard an den Speicher. Der Speicher sendet die lange Kette von Nullen und Einsen, die an dieser Adresse gespeichert ist, zurück an die CPU.
Diese lange Kette von Nullen und Einsen ist der Befehl. Sobald der Befehl zur CPU zurückkehrt, gelangt er in die Steuereinheit. Die Steuereinheit ist auch nur ein Haufen fest verdrahteter Logikgatter – ihre Aufgabe ist die Dekodierung. Wenn sie zum Beispiel sieht, dass die ersten Ziffern der eingehenden Nullen und Einsen 1011 sind, bewirkt ihre interne Verdrahtungsstruktur, dass diese hohen und niedrigen Spannungen genau den Schalter zur Additionsschaltung in der ALU aktivieren. Gleichzeitig gibt der Rest des Befehls an, welche Register die beiden zu addierenden Datenwerte enthalten.
Beim nächsten Schlag beginnt die Ausführungsphase. Die aktivierte Additionsschaltung empfängt die Daten, elektrische Signale durchblitzen in einem Augenblick das Logikgatternetz des Addierers, und das Ergebnis wird erzeugt.
Beim übernächsten Schlag wird das Ergebnis zurück in das angegebene Register geschrieben.
Schließlich erhöht sich der Programmzähler automatisch um eins und zeigt auf den nächsten Befehl im Speicher. Dann wiederholt sich der Zyklus. Milliarden Male pro Sekunde.
Das ist die vollständige grundlegende Wahrheit darüber, wie ein Computer funktioniert. Es gibt keinerlei fortgeschrittene Intelligenz – nur einen Quarzoszillator, der blind tickt, einen Programmzähler, der mechanisch Adressen erhöht, eine Steuereinheit, die roboterhaft Signalwege basierend auf den gelesenen Nullen und Einsen umschaltet, und eine ALU, die passiv eingehende Spannungspegel in neue Spannungspegel umwandelt.
Der Python-Code oder Java-Code, den du täglich schreibst, wird letztendlich von einer Software namens Compiler in eine lange, langwierige Folge von maschinenspezifischen Befehlen für die jeweilige CPU-Architektur übersetzt – reine Nullen und Einsen.
An diesem Punkt hast du tatsächlich die gesamte Kette vom Sand (Silizium) bis zum Programm durchlaufen. Viele Leute haben das Gefühl, an diesem Punkt zu verstehen, aber in der realen Industrieumgebung von heute reicht das bloße Verständnis traditioneller CPU-Prinzipien nicht einmal für die Mindestanforderung.
Angesichts des derzeit heißen Themas KI-Großmodelle muss ich deinen Horizont erweitern. Schauen wir uns an, wie die tatsächliche Rechenleistungslandschaft heute aussieht.
Jedes Team, das heute an großen Modellen arbeitet, ob für Training oder Inferenz, kann absolut keine CPUs zum Rechnen verwenden. Warum?
Weil CPUs für die komplexe Logiksteuerung ausgelegt sind. Sieh dir eine CPU an: Ein großer Teil ihrer Fläche ist für Sprungvorhersage, Cache-Verwaltung und die Steuereinheit reserviert. Der Teil, der tatsächlich für reine numerische Berechnungen genutzt wird – die ALU – ist nicht so groß. Es ist, als wäre die CPU ein hochgebildeter Intellektueller, der sich in komplexen Managementprozessen auskennt. Bitte ihn, 1+1 zu berechnen, er kann es, und er könnte sogar analysieren, ob ein Fehler vorliegt – aber er kann nur ein paar auf einmal bearbeiten.
Das mathematische Wesen im Kern großer Modelle ist die extrem große Matrixmultiplikation. Zum Beispiel die Multiplikation zweier Matrizen von mehreren Tausend mal mehreren Tausend. Das erfordert Hunderte Millionen Multiplikations- und Additionsoperationen. Die Logik ist extrem einfach – multiplizieren-addieren, multiplizieren-addieren – ohne komplexe Verzweigungen, aber das Datenvolumen ist atemberaubend.
Wenn du eine traditionelle CPU dafür verwenden würdest, könnte sie zwar Milliarden von Befehlen pro Sekunde ausführen, aber angesichts von Hunderten Milliarden Parametern wäre das ein Tropfen auf den heißen Stein.
Um wirklich zu verstehen, was große Modelle tatsächlich berechnen, wenn deine mathematische Intuition immer noch auf auswendig gelernten Formeln beruht, empfehle ich dir dringend, dir 3Blue1Browns “Essence of Linear Algebra” anzusehen. Um das Nachvollziehen und Ableiten zu erleichtern, kannst du es mit diesen zusammengestellten 3Blue1Brown-Notizen auf Chinesisch und Englisch kombinieren. Es schafft eine wirklich intuitive Visualisierung fortgeschrittener Matrixmultiplikation und linearer Transformationen. Danach wirst du ein reales physikalisches Bild von Multiplikations-Akkumulations-Operationen über Tausende von Parametern haben.
3Blue1Brown Lineare Algebra Notizen: Wahrscheinlich die beste chinesisch-englische Zusammenstellung im Web
Die Natur dieser massiven Matrixberechnung brachte die GPU hervor, die Grafikprozessoreinheit – die heute eigentlich als Allzweck-Parallelrecheneinheit bezeichnet werden sollte.
Die Designphilosophie einer GPU ist das genaue Gegenteil einer CPU. Sie entfernt die meisten komplexen Steuerschaltungen und großen Caches und füllt jeden freigewordenen physischen Raum mit den einfachstmöglichen ALUs. Ein aktueller NVIDIA H100-Chip enthält Zehntausende von Rechenkernen. Obwohl jeder Kern eine niedrigere Frequenz als ein CPU-Kern haben mag und schwache Steuerlogik besitzt, können sie alle gleichzeitig arbeiten.
Stell dir eine GPU als eine Formation von 100.000 Grundschülern vor, die nur Arithmetik beherrschen. Du gibst ihnen einen extrem einfachen Befehl: Multipliziere die Zahl zu deiner Linken mit der Zahl zu deiner Rechten. Alle 100.000 Schüler berechnen das Ergebnis gleichzeitig im selben Taktzyklus. Für die massiv parallelen Matrixoperationen, die große Modelle erfordern, ist eine GPU hundert- bis tausendmal effizienter als eine CPU.
Eigentlich ist KI – genau wie der Addierer der CPU – gar nicht so mysteriös. Sie ist immer noch nur Schicht um Schicht von Logik und Matrizen. Wenn du dein Verständnis von Deep Learning von Grund auf aufbauen möchtest, empfehle ich ein Buch, das viele auf Twitter dafür gelobt haben, KI vollständig zu entmystifizieren: Deep Learning with Python. Sobald du die Tensorberechnungen in Vorwärts- und Rückwärtspropagation verstanden hast, wirst du feststellen, dass es auch in großen Modellen keine Magie gibt.
Nachdem ich dieses Buch gelesen hatte, war ich vollständig von KI entmystifiziert!
Zurück zur Hardware. Wenn wir Low-Level-Algorithmusoptimierung betreiben, kämpfen wir die meiste Zeit mit der VRAM-Bandbreite. Hier stolpern auch viele fortgeschrittene Programmierer.
Weil die ALU so schnell rechnet. Wie bereits erwähnt, speichern Speichermodule Daten durch Laden und Entladen von Kondensatoren, und sie sind physisch eine gewisse Entfernung von der CPU oder GPU entfernt – elektrische Signale brauchen Zeit, um über das Motherboard zu reisen. Die größte Herausforderung für KI-Chips heute ist das, was in der Wissenschaft als Von-Neumann-Flaschenhals bezeichnet wird.
Das heißt: Tausende von Rechenkernen verarbeiten die Daten in ihren Händen in einem Augenblick, und dann können sie nur untätig herumsitzen und darauf warten, dass neue Daten aus dem langsamen Speicher bewegt werden. Selbst wenn du die On-Chip-Rechenschaltungen schneller machst, wenn du die Daten nicht schnell genug zuführen kannst, wird die Rechenleistung verschwendet.
Um dieses Problem zu lösen, wurden Hardware-Ingenieure zu extremen Maßnahmen getrieben. Da gewöhnliche Speichermodule zu weit weg und zu langsam sind, warum nicht den Speicher und den GPU-Chip direkt auf demselben Substrat verpacken? Um die Kanalbreite für die Datenübertragung zu erhöhen, verwenden sie anstelle traditioneller Drähte eine Technologie namens Silizium-Interposer – sie bohren Tausende mikroskopischer leitfähiger Durchkontaktierungen in das Silizium, um Speicher und Rechenkerne direkt zu verbinden. Das ist der sogenannte High Bandwidth Memory, HBM.
Wenn dich dieser Teil tief begeistert und du in der kommenden KI-Ära einen unersetzlichen, hochbezahlten Job als Architekt oder Low-Level-Entwickler sichern möchtest, empfehle ich dir dringend, dich mit Computer Architecture: A Quantitative Approach auseinanderzusetzen. Dieses Buch wurde von zwei Turing-Award-Gewinnern geschrieben, und so gut wie jeder Hardware-Ingenieur im Silicon Valley hat ein Exemplar. Es verwendet massenhaft reale Daten und Formeln, um dir zu erklären, warum Chips mit bestimmten Cache-Architekturen entworfen werden müssen und wo genau die Engpässe in der Multicore-Parallelität liegen. Obwohl es unglaublich trocken zu lesen ist und einige Kapitel sehr schwierig sind, ist es der notwendige Weg, um die kognitive Kluft beim Low-Level-Verständnis zu überbrücken.
Zurück zu deiner ursprünglichen Frage. Warum fühlst du dich immer noch verwirrt, nachdem du all diese Begriffe gelernt hast? Weil die traditionelle Lehre die lebendige Verbindung zwischen physikalischen Entitäten und logischen Abstraktionen durchtrennt.
Wenn du die CPU als eine magische Blackbox betrachtest, fühlen sich diese Begriffe wie unverständliche Definitionen an. Aber wenn du den physikalischen Gesetzen nach oben folgst:
- Weil hohe und niedrige Spannungen Logikgatter bilden können, erhielten wir Recheneinheiten, die Mathematik betreiben können.
- Weil Rückkopplungsschaltungen Spannungszustände fixieren können, erhielten wir Register, die Daten speichern können.
- Weil wir den Fluss elektrischer Signale rhythmisch steuern mussten, erhielten wir Quarzoszillatoren und Steuereinheiten.
- Weil dieses System zu komplex ist, als dass Menschen direkt Spannungspegel eingeben könnten, erfanden wir Befehlssätze, verpackten Nullen und Einsen in Assemblersprache und schließlich in C und Python.
Als Praktiker, der in dieser Branche durch den Dreck gezogen ist, kann ich dir sehr verantwortungsbewusst sagen: In dieser Ära kommen Frontend-Frameworks und gehen, Backend-Mikroservice-Architekturen haben ihre Zeit für ein paar Jahre, und sogar KI-Großmodell-Architekturen iterieren mit rasender Geschwindigkeit. Viele High-Level-Anwendungsentwicklungstechniken, die du heute lernst, könnten nächstes Jahr überholt sein. Tatsächlich können große Modelle selbst viele grundlegende Programmieraufgaben bereits besser erledigen als der durchschnittliche Programmierer.
Aber das Eine, was sich nie ändert, ist dieser Satz grundlegender Computerfunktionsprinzipien, die in der Halbleiterphysik verwurzelt sind. Egal wie Software abstrahiert wird, egal wie ausgefeilt Algorithmen werden, alles läuft letztendlich auf Spannungsschwankungen auf einem Stück Silizium hinaus. Je fortgeschrittener die Leistungsoptimierung, je zukunftsweisender das Rechen-Scheduling, desto mehr brauchen Ingenieure die Fähigkeit, durch alle Software-Abstraktionsschichten hindurchzusehen und den Betriebszustand der zugrundeliegenden Hardware direkt wahrzunehmen.
Denk nicht, dass dieses Low-Level-Wissen weit von dir entfernt ist. Wenn du auf ein extrem leistungshungriges Stück Code triffst, und weil du den Cache-Line-Mechanismus auf der untersten Ebene verstehst, die Anordnung von Arrays im Speicher anpasst, um die CPU-Cache-Trefferquoten drastisch zu verbessern – und der Code dadurch zehnmal schneller läuft – in diesem Moment wirst du das immense Gefühl der Kontrolle spüren, das mit der Beherrschung der zugrundeliegenden Prinzipien einhergeht.