Es scheint mir, dass heutzutage viele Berechnungen an der GPU durchgeführt werden. Natürlich werden dort Grafiken erstellt, aber mit CUDA und dergleichen, KI, Hashing-Algorithmen (denken Sie an Bitcoins) und anderen wird auch auf der GPU gearbeitet. Warum können wir die CPU nicht einfach loswerden und die GPU alleine verwenden? Was macht die GPU so viel schneller als die CPU?
370
Antworten:
TL; DR-Antwort: GPUs haben weitaus mehr Prozessorkerne als CPUs. Da jedoch jeder GPU-Kern deutlich langsamer als ein CPU-Kern ist und nicht über die für moderne Betriebssysteme erforderlichen Funktionen verfügt, eignen sie sich nicht für die Durchführung eines Großteils der täglichen Verarbeitung rechnen. Sie eignen sich am besten für rechenintensive Vorgänge wie Videoverarbeitung und Physiksimulationen.
GPGPU ist noch ein relativ neues Konzept. GPUs wurden ursprünglich nur zum Rendern von Grafiken verwendet. Mit fortschreitender Technologie wurde die große Anzahl von GPU-Kernen im Vergleich zu CPUs ausgenutzt, um Rechenfunktionen für GPUs zu entwickeln, mit denen viele parallele Datenströme gleichzeitig verarbeitet werden können, unabhängig davon, um welche Daten es sich handelt. Während GPUs Hunderte oder sogar Tausende von Stream-Prozessoren haben können, laufen sie jeweils langsamer als ein CPU-Kern und haben weniger Funktionen (selbst wenn sie vollständig sind und so programmiert werden können, dass jedes Programm ausgeführt werden kann, das eine CPU ausführen kann). Zu den Funktionen, die bei GPUs fehlen, gehören Interrupts und virtueller Speicher, die zur Implementierung eines modernen Betriebssystems erforderlich sind.
Mit anderen Worten, CPUs und GPUs weisen erheblich unterschiedliche Architekturen auf, die sie für unterschiedliche Aufgaben besser geeignet machen. Eine GPU kann große Datenmengen in vielen Streams verarbeiten und relativ einfache Vorgänge ausführen, eignet sich jedoch nicht für die umfangreiche oder komplexe Verarbeitung einzelner oder weniger Datenströme. Eine CPU ist pro Kern viel schneller (in Form von Anweisungen pro Sekunde) und kann komplexe Vorgänge mit einem oder wenigen Datenströmen einfacher ausführen, kann jedoch nicht viele Datenströme gleichzeitig effizient verarbeiten.
Infolgedessen sind GPUs nicht für Aufgaben geeignet, die nicht wesentlich von der Parallelisierung profitieren oder nicht parallelisiert werden können, einschließlich vieler gängiger Verbraucheranwendungen wie Textverarbeitungsprogrammen. Darüber hinaus verwenden GPUs eine grundlegend andere Architektur. Man müsste eine Anwendung speziell für eine GPU programmieren, damit sie funktioniert, und zum Programmieren von GPUs sind erheblich andere Techniken erforderlich. Diese verschiedenen Techniken umfassen neue Programmiersprachen, Änderungen an vorhandenen Sprachen und neue Programmierparadigmen, die besser geeignet sind, eine Berechnung als eine von vielen Stream-Prozessoren auszuführende Paralleloperation auszudrücken. Weitere Informationen zu den zum Programmieren von GPUs erforderlichen Techniken finden Sie in den Wikipedia-Artikeln zur Stream-Verarbeitung und zum Parallel-Computing .
Moderne GPUs sind in der Lage, Vektoroperationen und Gleitkomma-Arithmetik auszuführen. Die neuesten Karten können Gleitkommazahlen mit doppelter Genauigkeit verarbeiten. Mit Frameworks wie CUDA und OpenCL können Programme für GPUs geschrieben werden, und aufgrund der Art der GPUs eignen sie sich am besten für hochparallelisierbare Vorgänge, z Computercluster wie bei NVIDIA Tesla Personal Supercomputern . Verbraucher mit modernen GPUs, die Erfahrung mit Folding @ home haben, können mit diesen GPU-Clients Beiträge leisten, die mit sehr hoher Geschwindigkeit Proteinfaltungssimulationen durchführen und mehr Arbeit für das Projekt leisten können (lesen Sie unbedingt die häufig gestellten Fragenerstens vor allem im Zusammenhang mit GPUs). GPUs können auch mithilfe von PhysX eine bessere Physiksimulation in Videospielen ermöglichen, die Kodierung und Dekodierung von Videos beschleunigen und andere rechenintensive Aufgaben ausführen. Es sind diese Arten von Aufgaben, für die sich GPUs am besten eignen.
AMD ist Vorreiter bei einem Prozessordesign namens Accelerated Processing Unit (APU) , das herkömmliche x86-CPU-Kerne mit GPUs kombiniert. Dieser Ansatz ermöglicht eine Grafikleistung, die Grafiklösungen mit integriertem Motherboard weit überlegen ist (obwohl teurere Grafikprozessoren nicht mithalten können), und ermöglicht ein kompaktes, kostengünstiges System mit guter Multimedia-Leistung, ohne dass eine separate GPU erforderlich ist. Die neuesten Intel-Prozessoren bieten auch integrierte Grafik auf dem Chip, obwohl die wettbewerbsfähige integrierte GPU-Leistung derzeit auf die wenigen Chips mit Intel Iris Pro Graphics beschränkt ist. Mit fortschreitender Technologie werden wir einen zunehmenden Grad an Konvergenz dieser einmal getrennten Teile feststellen. AMD-VorstellungenEine Zukunft, in der CPU und GPU eine Einheit bilden und in der die gleiche Aufgabe nahtlos gelöst werden kann .
Dennoch sind viele Aufgaben, die von PC-Betriebssystemen und -Anwendungen ausgeführt werden, noch besser für CPUs geeignet, und es ist viel Arbeit erforderlich, um ein Programm mithilfe einer GPU zu beschleunigen. Da so viele vorhandene Softwareprodukte die x86-Architektur verwenden und GPUs unterschiedliche Programmiertechniken erfordern und mehrere wichtige Funktionen für Betriebssysteme fehlen, ist ein allgemeiner Übergang von der CPU zur GPU für das tägliche Computing sehr schwierig.
quelle
Die GPU ist nicht schneller als die CPU. CPU und GPU sind mit zwei unterschiedlichen Zielen und unterschiedlichen Kompromissen konzipiert, sodass sie unterschiedliche Leistungsmerkmale aufweisen. Bestimmte Aufgaben sind in einer CPU schneller, während andere Aufgaben in einer GPU schneller berechnet werden. Die CPU zeichnet sich durch komplexe Manipulationen an einer kleinen Datenmenge aus, die GPU durch einfache Manipulationen an einer großen Datenmenge.
Die GPU ist eine Spezial-CPU, die so konzipiert ist, dass ein einzelner Befehl über einen großen Datenblock (SIMD / Single Instruction Multiple Data) funktioniert, wobei alle denselben Vorgang anwenden. Das Arbeiten in Datenblöcken ist mit Sicherheit effizienter als das gleichzeitige Arbeiten mit einer einzelnen Zelle, da das Decodieren der Anweisungen einen erheblich geringeren Aufwand bedeutet. Das Arbeiten in großen Blöcken bedeutet jedoch, dass mehr parallele Arbeitseinheiten vorhanden sind, sodass viel mehr Transistoren verwendet werden einen einzelnen GPU-Befehl zu implementieren (was zu Einschränkungen der physischen Größe führt, mehr Energie verbraucht und mehr Wärme erzeugt).
Die CPU ist darauf ausgelegt, eine einzelne Anweisung auf einem einzelnen Datum so schnell wie möglich auszuführen. Da es nur mit einem einzelnen Datum arbeiten muss, ist die Anzahl der Transistoren, die zum Implementieren eines einzelnen Befehls erforderlich sind, viel geringer, sodass sich eine CPU einen größeren Befehlssatz, eine komplexere ALU, eine bessere Verzweigungsvorhersage und eine bessere Virtualisierung leisten kann Architektur und ein ausgefeilteres Caching / Pipeline-Schema. Die Befehlszyklen sind auch schneller.
Der Grund, warum wir immer noch CPU verwenden, ist nicht, dass x86 der König der CPU-Architektur ist und Windows für x86 geschrieben wurde. Der Grund, warum wir immer noch CPU verwenden, ist, dass die Art von Aufgaben, die ein Betriebssystem ausführen muss, dh Entscheidungen wird auf einer CPU-Architektur effizienter ausgeführt. Ein Betriebssystem muss Hunderte verschiedener Datentypen betrachten und verschiedene Entscheidungen treffen, die alle voneinander abhängen. Diese Art von Job lässt sich nicht leicht parallelisieren, zumindest nicht in eine SIMD-Architektur.
Was wir in Zukunft sehen werden, ist eine Konvergenz zwischen der CPU- und der GPU-Architektur, wenn die CPU die Fähigkeit erlangt, über Datenblöcke, z. B. SSE, zu arbeiten. Da sich die Herstellungstechnologie verbessert und die Chips kleiner werden, kann es sich die GPU leisten, komplexere Anweisungen zu implementieren.
quelle
GPUs fehlen:
Sie benötigen diese, um so etwas wie ein modernes Betriebssystem zu implementieren.
Sie sind auch (relativ) langsam bei doppeltgenauer Arithmetik (im Vergleich zu ihrer einfachgenauen Rechenleistung) * und viel größer (in Bezug auf die Siliziumgröße). Ältere GPU-Architekturen unterstützen keine indirekten Aufrufe (über Funktionszeiger), die für die meisten allgemeinen Programmieraufgaben benötigt werden, und neuere Architekturen, die dies nur langsam tun. Schließlich verlieren GPUs bei Aufgaben, die nicht parallelisiert werden können, im Vergleich zu CPUs bei gleicher Auslastung (wie in anderen Antworten angegeben).
EDIT : Bitte beachten Sie, dass diese Antwort im Jahr 2011 geschrieben wurde - GPU Tech ist ein Bereich, der sich ständig ändert. Die Dinge können sehr unterschiedlich sein, je nachdem, wann Sie dies lesen: P
* Einige GPUs, wie NVidias Quadro- oder Tesla-Linien (Fermi-Generation oder neuer) oder AMDs FirePro-Linie (GCN-Generation oder neuer), sind bei doppelter Rechengenauigkeit nicht langsam. Diese sind jedoch nicht in den meisten Verbrauchermaschinen enthalten.
quelle
Eine CPU ist wie ein Arbeiter, der superschnell arbeitet. Eine GPU ist wie eine Gruppe von Klonarbeitern, die schnell arbeiten, aber alle genau dasselbe tun müssen (mit der Ausnahme, dass Sie einige Klone untätig lassen können, wenn Sie möchten).
Was hätten Sie lieber als Mitentwickler, einen superschnellen Typ oder 100 schnelle Klone, die eigentlich nicht so schnell sind, aber alle die gleichen Aktionen gleichzeitig ausführen müssen?
Für einige Aktionen sind die Klone ziemlich gut, z. B. den Boden fegen - sie können jeweils einen Teil davon fegen.
Bei einigen Aktionen stinken die Klone, z. B. schreiben Sie den wöchentlichen Bericht - alle Klone außer einem sitzen im Leerlauf, während ein Klon den Bericht schreibt (ansonsten erhalten Sie nur 100 Kopien desselben Berichts).
quelle
Weil GPUs so konstruiert sind, dass sie viele kleine Dinge gleichzeitig erledigen, und CPUs so konstruiert sind, dass sie jeweils eine Sache erledigen. Wenn Ihr Prozess wie beim Hashing massiv parallel ausgeführt werden kann, ist die GPU um Größenordnungen schneller, andernfalls wird dies nicht der Fall sein.
Ihre CPU kann einen Hash viel, viel schneller berechnen als Ihre GPU - aber die Zeit, die Ihre CPU dafür benötigt, könnte Ihre GPU einige hundert Hashes durchlaufen. GPUs sind so konzipiert, dass sie eine Menge Dinge gleichzeitig erledigen, und CPUs sind so konzipiert, dass sie eine Sache gleichzeitig erledigen, jedoch sehr schnell.
Das Problem ist, dass CPUs und GPUs sehr unterschiedliche Lösungen für sehr unterschiedliche Probleme darstellen. Es gibt eine kleine Überlappung, aber im Allgemeinen bleibt das, was sich in ihrer Domäne befindet, in ihrer Domäne. Wir können die CPU nicht durch eine GPU ersetzen, da die CPU dort viel besser arbeitet als eine GPU es jemals könnte, einfach weil eine GPU nicht für diese Aufgabe ausgelegt ist und eine CPU dies tut.
Eine kleine Randnotiz, wenn es möglich wäre, die CPU zu verschrotten und nur eine GPU zu haben, denken Sie nicht, wir würden sie umbenennen? :)
quelle
Fragen Sie sich wirklich, warum wir keine GPU-ähnlichen Architekturen in der CPU verwenden?
GPU ist nur eine spezialisierte CPU einer Grafikkarte. Wir verleihen der GPU keine Grafikberechnung, da Allzweck-CPUs bei der parallelen Ausführung und der Gleitkomma-Ausführung einfach nicht auf dem neuesten Stand sind.
Wir verwenden tatsächlich verschiedene (mehr GPU-gerechte) CPU-Architekturen. Niagara- Prozessoren sind z. B. ziemlich multitasking. SPARC T3 führt 512 gleichzeitige Threads aus.
quelle
Ich könnte mich hier schrecklich irren und spreche von wenig oder keiner Autorität in diesem Thema, aber hier ist:
Ich glaube, dass jede GPU-Ausführungseinheit ("Core") im Vergleich zu einer CPU einen sehr begrenzten Adressraum hat.
GPU-Ausführungseinheiten können nicht effizient verzweigen.
GPU-Ausführungseinheiten unterstützen Hardware-Interrupts nicht wie CPUs.
Ich habe immer gedacht, dass die GPU-Ausführungseinheiten so etwas wie die "SPEs" der Playstation 3 sind. Sie möchten einen Datenblock erhalten, eine Reihe von sequentiellen Vorgängen ausführen und dann einen weiteren Block ausspucken Daten, spülen, wiederholen. Sie haben nicht so viel adressierbaren Speicher wie das Haupt- "CPE", aber die Idee ist, jede "SPE" einer bestimmten, sequentiellen Aufgabe zu widmen. Der Ausgang einer Einheit kann den Eingang einer anderen Einheit speisen.
Die Ausführungseinheiten funktionieren nicht gut, wenn sie versuchen, die Daten zu "analysieren" und basierend auf diesen Daten eine Reihe von Entscheidungen zu treffen.
Diese "Datenblöcke" können Teil eines Streams sein, z. B. eine Liste von Scheitelpunkten aus der Statustabelle eines Spiels, MPEG-Daten von einer Festplatte usw.
Wenn etwas nicht zu diesem "Streaming" -Modell passt, haben Sie eine Aufgabe, die nicht effizient paralelliert werden kann, und die GPU ist nicht unbedingt die beste Lösung dafür. Ein gutes Beispiel ist die Verarbeitung von "externen Ereignissen" wie Tastaturen, Joysticks oder Netzwerkeingaben. Es gibt nicht viele Dinge, die nicht zu diesem Modell passen, aber es wird immer ein paar geben.
quelle
Hier geht es nicht um die Taktrate oder den Zweck. Sie sind beide gleichermaßen in der Lage, die meisten, wenn nicht alle Aufgaben zu erledigen. Einige sind jedoch für einige Aufgaben etwas besser geeignet als andere.
Es gab eine sehr alte Auseinandersetzung darüber, ob es besser ist, viele dumme Kerne oder eine kleine Gruppe sehr kluger Kerne zu haben. Dies geht leicht in die 80er zurück.
In einer CPU gibt es viele mögliche Berechnungen, die durchgeführt werden können. Die intelligenteren Kerne können viele verschiedene Berechnungen gleichzeitig ausführen (ähnlich wie Multi-Core, aber nicht kompliziert; siehe Parallelität auf Befehlsebene ). Ein intelligenter Kern kann mehrere Berechnungen gleichzeitig ausführen (Addition, Subtraktion, Multiplikation, Division, Speicheroperation), jedoch immer nur eine. Aus diesem Grund sind sie physisch größer (und daher viel teurer) als stumpfe Kerne.
Ein dummer Kern ist viel kleiner und daher können einem einzelnen Chip mehr hinzugefügt werden, aber es können nicht so viele Berechnungen gleichzeitig durchgeführt werden. Es gibt ein feines Gleichgewicht zwischen vielen dummen Kernen und einigen intelligenten Kernen.
Multi-Core-Architekturen eignen sich gut für Grafiken, da die Berechnungen leicht auf Hunderte von Kernen aufgeteilt werden können. Sie hängen jedoch auch von der Qualität des Codes ab und davon, ob sich anderer Code auf das Ergebnis einer Berechnung stützt.
Dies ist eine viel kompliziertere Frage, als es erscheinen mag. Weitere Informationen finden Sie in diesem Artikel zum CPU-Design:
quelle
Ich möchte einen syntaktischen Punkt ansprechen: Die Begriffe CPU und GPU sind funktionale Namen, keine architektonischen Namen.
Wenn ein Computer eine GPU als Hauptprozessor verwenden würde, würde er unabhängig von Architektur und Design zu einer "zentralen Prozessoreinheit" (CPU).
quelle
Es ist wichtig zu bedenken, dass es im Architekturraum keine magische Trennlinie gibt, die einen Prozessor zum "zentralen" und einen anderen zum "grafischen" Prozessor macht. (Nun, einige GPUs sind möglicherweise zu verkrüppelt, um ganz allgemein zu sein, aber das sind nicht die, über die wir hier sprechen.)
Die Unterscheidung besteht darin, wie sie auf der Platine installiert sind und welche Aufgaben ihnen übertragen werden. Natürlich verwenden wir einen Allzweckprozessor (oder eine Reihe von Allzweckprozessoren) für den Hauptdatenträger und eine spezielle, parallelisierte Einheit mit vielen Pipelines (z. B. Grafiken), um sie optimal nutzen zu können.
Die meisten pfiffigen Tricks, mit denen GPUs ihre Sache sehr schnell erledigen, wurden zuerst von Leuten entwickelt, die versuchen, schnellere und bessere CPUs zu entwickeln. Es stellt sich heraus, dass Word, Excel, Netscape und viele andere Dinge, für die Benutzer ihre Computer verwenden, nicht nur die von Grafikspezialchips angebotenen Funktionen nicht voll ausnutzen, sondern auf diesen Architekturen sogar langsamer laufen, da die Verzweigung sehr ursächlich ist (sehr teuer) und langsam) Pipeline wird gelöscht.
quelle
Der springende Punkt bei der Einführung einer GPU war, die CPU von teuren Grafikberechnungen zu entlasten.
Wenn Sie sie wieder zu einem einzigen Prozessor kombinieren, kehren Sie dorthin zurück, wo alles angefangen hat.
quelle
Aus einem einfachen Grund: Die meisten Anwendungen sind nicht multithreaded / vektorisiert.
Grafikkarten setzen zumindest im Konzept stark auf Multi-Threading.
Vergleichen Sie ein Auto mit einem einzigen Motor, ein Auto mit einem kleineren Motor pro Rad. Bei letzterem Auto müssen Sie alle Motoren steuern, was aus Sicht der Systemprogrammierung nicht berücksichtigt wurde.
Mit der AMD-Fusion wird sich jedoch ändern, wie wir die Verarbeitungsleistung nutzen müssen: entweder vektorisiert, oder schnell für einen Thread.
quelle
Der Grund, warum wir immer noch CPUs verwenden, ist, dass sowohl CPUs als auch GPUs ihre einzigartigen Vorteile haben. Weitere Informationen finden Sie in meinem folgenden Artikel, der in ACM Computing Surveys 2015 angenommen wurde und eine abschließende und umfassende Diskussion zum Übergang von der Debatte „CPU vs. GPU“ zu „CPU-GPU Collaborative Computing“ bietet.
Ein Überblick über heterogene CPU-GPU-Rechentechniken
quelle
Um es einfach auszudrücken: Die GPU kann mit dem Anhänger im Auto verglichen werden. Wie gewöhnlich ist Kofferraum für die meisten Menschen ausreichend, mit Ausnahme von Fällen, in denen sie etwas wirklich Großes kaufen. Dann können sie Trailer brauchen. Das gleiche gilt für die GPU, da normalerweise eine normale CPU ausreicht, um die meisten Aufgaben zu erledigen. Wenn Sie jedoch einige intensive Berechnungen in vielen Threads benötigen, benötigen Sie möglicherweise eine GPU
quelle
GPUS sind gute Stream-Prozessoren. Sie können sich die Stream-Verarbeitung so vorstellen, dass Sie eine lange Reihe von Zahlen nacheinander multiplizieren. cpus verfügt auch über Stream-Verarbeitungsfunktionen (es werden SIMD-Erweiterungen genannt), aber Sie können nicht die gesamte Programmierlogik als Stream-Verarbeitung implementieren, und Compiler haben die Möglichkeit, Btyecode zu erstellen, der nach Möglichkeit die Verwendung von simd-Anweisungen erfordert.
Nicht alles ist ein Array von Zahlen. Bilder und Videos sind, vielleicht auch Ton (es gibt hier und da OpenCl-Encoder). so kann gpus bilder, videos und ähnliches verarbeiten, kodieren und dekodieren. ein nachteil ist, dass man in spiele nicht alles auf gpus auslagern kann, weil es stottern würde, gpus mit grafiken beschäftigt sind und der engpass im system sein sollen, wenn spiele gespielt werden. die optimale lösung wäre, alle komponenten in einem pc voll auszunutzen. So führt beispielsweise die Physx-Engine von NVIDIA standardmäßig Berechnungen für die CPU durch, wenn die GPU voll ausgelastet ist.
quelle