Ich habe nach Prozessoren und Grafikkarten gesucht und festgestellt, dass GPUs viel schneller sind als CPUs. In diesem einen Artikel habe ich gelesen , dass eine 2-jährige Nvidia-GPU unter bestimmten Umständen einen 3,2-GHz-Core-I7-Intel-Prozessor um das 14-fache übertroffen hat. Wenn GPUs so schnell sind, warum verwenden Entwickler sie nicht für jede Funktion in einem Spiel? Können GPUs etwas anderes als Grafiken verwenden?
63
GPU is faster than a CPU
ist ein falscher Mythos, dem viele Menschen glauben, nachdem sie Benchmarks auf der Grundlage von Problemen gesehen haben, die speziell auf die GPU zugeschnitten sind (diese Problemklasse wird als "peinlich parallele Probleme" bezeichnet). Siehe meine Antwort auf diese SuperUser-Frage: Warum verwenden wir immer nochAntworten:
"Ich habe gelesen, dass F1-Autos schneller sind als die, die wir auf der Straße fahren ... warum benutzen die Leute dann keine F1-Autos?" Nun ... Die Antwort auf diese Frage ist einfach: F1-Autos können nicht so schnell brechen oder drehen wie die meisten Autos (in diesem Fall könnte das langsamste Auto eine F1 schlagen). Der Fall von GPUs ist sehr ähnlich. Sie können einer geraden Verarbeitungslinie folgen, aber sie sind nicht so gut, wenn es um die Auswahl verschiedener Verarbeitungspfade geht.
Ein in der GPU ausgeführtes Programm ist sinnvoll, wenn es mehrere Male parallel ausgeführt werden muss, z. B. wenn Sie alle Pixel aus Textur A mit Pixeln aus Textur B mischen und sie alle in Textur C einfügen müssen Eine CPU würde wie folgt verarbeitet:
Dies ist jedoch langsam, wenn Sie viele Pixel verarbeiten müssen, sodass die GPU anstelle des obigen Codes nur den nächsten verwendet:
Anschließend werden alle Kerne mit diesem Programm gefüllt (dh das Programm wird im Wesentlichen in den Kern kopiert), und
i
für jeden wird ein Wert zugewiesen. Dann kommt die Magie von der GPU und alle Kerne führen das Programm zur gleichen Zeit aus , wodurch viele Operationen viel schneller ausgeführt werden, als es das lineare CPU-Programm tun könnte.Diese Arbeitsweise ist in Ordnung, wenn Sie sehr viele kleine Eingaben auf die gleiche Weise verarbeiten müssen, aber wirklich schlecht, wenn Sie ein Programm erstellen müssen, das möglicherweise eine bedingte Verzweigung aufweist. Nun wollen wir sehen, was die CPU macht, wenn es um eine Zustandsprüfung geht:
Dies ist sehr schnell, wenn die CPU einen Index festlegt, aber wenn die GPU dasselbe tut, ist es viel komplizierter. Da der Strom von der GPU aus der Ausführung derselben Anweisung zur selben Zeit stammt (es handelt sich um SIMD-Kerne), müssen sie synchronisiert werden, um die Vorteile der Chiparchitektur nutzen zu können. Die GPU auf den Umgang mit Branchen vorbereiten zu müssen, bedeutet mehr oder weniger:
Diese Methode kann aufgrund vieler Faktoren variieren (z. B. aufgrund einiger sehr kleiner Faktoren)Verzweigungen können ohne diese Unterscheidung ausgeführt werden. Jetzt können Sie jedoch bereits erkennen, warum Verzweigungen ein Problem darstellen. Die GPU-Caches sind sehr klein. Sie können ein Programm nicht einfach linear aus dem VRAM ausführen. Sie müssen kleine Anweisungsblöcke auf die auszuführenden Kerne kopieren. Wenn Sie genügend Verzweigungen haben, wird Ihre GPU meistens blockiert als ausgeführt jeder Code, der keinen Sinn ergibt, wenn ein Programm ausgeführt wird, das nur einem Zweig folgt, wie es die meisten Programme tun - auch wenn es in mehreren Threads ausgeführt wird. Im Vergleich zum F1-Beispiel bedeutet dies, dass Sie in jeder Kurve Bremsfallschirme öffnen und dann aus dem Auto aussteigen müssen, um sie wieder im Auto zu verstauen, bis Sie in die nächste Kurve einbiegen möchten, oder ein rotes Semaphor (die nächste Kurve) finden müssen höchstwahrscheinlich).
Dann gibt es natürlich das Problem, dass andere Architekturen für logische Operationen so gut geeignet sind, weitaus billiger und zuverlässiger, standardisierter, bekannter, energieeffizienter usw. Neuere Videokarten sind ohne Software-Emulation kaum mit älteren kompatibel Verwenden Sie unterschiedliche ASM-Anweisungen, auch wenn sie vom selben Hersteller stammen. Derzeit erfordern die meisten Computeranwendungen keine solche parallele Architektur. Selbst wenn sie diese benötigen, können sie über Standard-APIs wie OpenCL as verwendet werden Erwähnt durch eBusiness oder durch die Grafik-API. Wahrscheinlich werden wir in einigen Jahrzehnten GPUs haben, die CPUs ersetzen können, aber ich glaube nicht, dass dies in Kürze geschehen wird.
Ich empfehle die Dokumentation der AMD APP, die viel über ihre GPU-Architektur erklärt, und ich habe auch die NVIDIA in den CUDA-Handbüchern gesehen, was mir sehr geholfen hat, dies zu verstehen. Ich verstehe immer noch einige Dinge nicht und kann mich irren. Wahrscheinlich kann jemand, der mehr weiß, meine Aussagen bestätigen oder ablehnen, was für uns alle großartig wäre.
quelle
the fastest isn't always the fastest
.GPUs sind sehr gut eine parallele Aufgabe. Was großartig ist ... wenn Sie parallele Aufgaben ausführen.
Bei Spielen handelt es sich um die am wenigsten parallelisierbare Art der Anwendung. Denken Sie an die Hauptspielschleife. Die KI (nehmen wir an, der Spieler wird als Sonderfall der KI behandelt) muss auf Kollisionen reagieren, die von der Physik erkannt wurden. Es muss also nachlaufen. Zumindest muss die Physik KI-Routinen innerhalb der Grenzen des physikalischen Systems aufrufen (was aus vielen Gründen im Allgemeinen keine gute Idee ist). Grafiken können erst ausgeführt werden, wenn die Physik ausgeführt wurde, da die Position von Objekten durch die Physik aktualisiert wird. Natürlich muss AI auch vor dem Rendern ausgeführt werden, da AI neue Objekte erzeugen kann. Sounds müssen nach KI- und Player-Steuerelementen ausgeführt werden
Im Allgemeinen können sich Spiele auf sehr wenige Arten selbst einfädeln. Grafiken können in einem Thread abgespult werden. Die Spieleschleife kann eine Reihe von Daten in den Grafikthread verschieben und sagen: Rendern Sie diese. Es kann einige grundlegende Interpolationen durchführen, so dass die Hauptspielschleife nicht mit der Grafik synchron sein muss. Sound ist ein weiterer Thread; Die Spieleschleife sagt "play this" und es wird gespielt.
Danach fängt alles an, schmerzhaft zu werden. Wenn Sie über komplexe Pfad-Algorithmen verfügen (z. B. für RTS), können Sie diese einfädeln. Es kann einige Frames dauern, bis die Algorithmen abgeschlossen sind, aber sie sind mindestens gleichzeitig vorhanden. Darüber hinaus ist es ziemlich schwer.
Sie sehen sich also vier Themen an: Spiel, Grafik, Sound und möglicherweise die langfristige AI-Verarbeitung. Das ist nicht viel. Und das ist nicht annähernd genug für GPUs, die buchstäblich auf einmal Hunderte von Threads im Flug haben. Das ist es, was GPUs zu ihrer Leistung verhilft: Sie können alle diese Threads gleichzeitig nutzen. Und Spiele können das einfach nicht.
Vielleicht können Sie jetzt für einige Operationen "weit" gehen. AIs sind zum Beispiel normalerweise unabhängig voneinander. Sie können also mehrere Dutzend AIs gleichzeitig verarbeiten. Bis Sie sie tatsächlich voneinander abhängig machen müssen. Dann steckst du in Schwierigkeiten. Physikobjekte sind ähnlich unabhängig ... es sei denn, es gibt eine Einschränkung zwischen ihnen und / oder sie kollidieren mit etwas. Dann werden sie sehr abhängig.
Hinzu kommt, dass die GPU einfach keinen Zugriff auf Benutzereingaben hat, was meines Wissens für Spiele wichtig ist. Das müsste also zur Verfügung gestellt werden. Es gibt auch keinen direkten Dateizugriff oder eine echte Methode, um mit dem Betriebssystem zu kommunizieren. Es müsste also wieder eine Möglichkeit geben, dies zu gewährleisten. Oh, und all diese Soundverarbeitung? GPUs geben keine Töne ab. Die müssen also zurück zur CPU und dann raus zum Soundchip.
Oh, und das Codieren für GPUs ist schrecklich. Es ist schwer, richtig zu liegen, und was für eine GPU-Architektur "richtig" ist, kann für eine andere sehr, sehr falsch sein. Dabei wird nicht nur von AMD zu NVIDIA gewechselt. Das könnte ein Wechsel von einer GeForce 250 zu einer GeForce 450 sein. Das ist eine Änderung in der Grundarchitektur. Und es könnte leicht dazu führen, dass Ihr Code nicht gut läuft. C ++ und sogar C sind nicht zulässig. Das Beste, was du bekommst, ist OpenCL, ähnlich wie C, aber ohne einige der Feinheiten. Wie eine Rekursion . Das ist richtig: keine Rekursion auf GPUs.
Debuggen? Oh, ich hoffe, Sie mögen die Debugging-Funktionen Ihrer IDE nicht, da diese sicherlich nicht verfügbar sind. Auch wenn Sie GDB verwenden, küssen Sie das auf Wiedersehen. Sie müssen auf das
printf
Debuggen zurückgreifen ... Warten Sie, es gibt keineprintf
GPUs. Sie müssen also in die Speicherorte schreiben und von Ihrem CPU-Stub-Programm zurücklesen lassen.Das ist richtig: manuelles Debuggen. Viel Glück damit.
Welche hilfreichen Bibliotheken verwenden Sie in C / C ++? Oder vielleicht sind Sie eher ein .NET-Typ, der XNA und so weiter verwendet. Oder Wasauchimmer. Es spielt keine Rolle, da Sie keine davon auf der GPU verwenden können. Sie müssen alles von Grund auf neu codieren. Und wenn Sie eine bereits vorhandene Codebasis haben, ist es schwierig: Es ist Zeit, den gesamten Code neu zu schreiben.
Also ja. Es ist schrecklich, für jede komplexe Art von Spiel etwas zu tun. Und es würde nicht einmal funktionieren, da Spiele einfach nicht parallel genug sind, um zu helfen.
quelle
Warum ist nicht so einfach zu beantworten - es ist wichtig zu beachten, dass GPUs spezialisierte Prozessoren sind, die nicht wirklich für den allgemeinen Gebrauch wie eine normale CPU gedacht sind. Aufgrund dieser Spezialisierung ist es nicht verwunderlich, dass eine GPU eine CPU übertrifft, für die sie speziell entwickelt (und optimiert) wurde. Dies bedeutet jedoch nicht unbedingt, dass sie die volle Funktionalität und Leistung einer generalisierten CPU ersetzen kann.
Ich vermute, dass Entwickler dies aus verschiedenen Gründen nicht tun, darunter:
Sie möchten, dass die Grafiken so schnell und in höchster Qualität wie möglich sind, und die Verwendung wertvoller GPU-Ressourcen könnte dies beeinträchtigen.
Möglicherweise muss GPU-spezifischer Code geschrieben werden, was die gesamte Programmierung des Spiels (oder der Anwendung) wahrscheinlich noch komplexer macht.
Eine GPU hat normalerweise keinen Zugriff auf Ressourcen wie Netzwerkkarten, Tastaturen, Mäuse und Joysticks, sodass sie nicht jeden Aspekt des Spiels bewältigen kann.
Antwort auf den zweiten Teil Ihrer Frage: Ja, es gibt andere Verwendungszwecke. Beispielsweise verwenden Projekte wie SETI @ Home (und wahrscheinlich auch andere BOINC-Projekte) GPUs (wie die von nVidia) für komplexe Hochgeschwindigkeitsberechnungen:
Führen Sie SETI @ home auf Ihrer NVIDIA-GPU aus:
http://setiathome.berkeley.edu/cuda.php
( Ich mag deine Frage, weil sie eine interessante Idee aufwirft. )
quelle
CPUs sind flexibler, es ist im Allgemeinen einfacher, sie zu programmieren, sie können einzelne Threads viel schneller ausführen.
Während moderne GPUs so programmiert werden können, dass sie so gut wie jede Aufgabe lösen, erhalten sie nur dann einen Geschwindigkeitsvorteil, wenn sie ihre parallele Architektur nutzen können. Dies ist normalerweise bei sich häufig wiederholenden "einfachen" Aufgaben der Fall. Ein Großteil des Codes, den wir schreiben, verzweigt sich zu unvorhersehbar, um auf einer GPU effizient ausgeführt zu werden.
Außerdem könnten Sie viel Zeit damit verbringen, den Code für verschiedene Grafikchips zu optimieren. OpenCL ist zwar verfügbar, damit derselbe Code auf vielen verschiedenen Grafikchips ausgeführt werden kann, Sie tauschen jedoch einen Teil des Geschwindigkeitsvorteils für diesen Luxus aus.
Aus Sicht eines Spielprogrammierers möchten wir, dass unser Spiel auch auf Computern mit weniger Grafikkarten läuft. Einige der integrierten Chips haben nicht die erforderliche Programmierbarkeit, aber wenn sie dies tun, sind sie so langsam, dass sie den Prozessor auch für die Art von Jobs, in denen sie gut sein sollten, nicht mit einem großen Vorsprung schlagen. Und wenn Sie sich für ein Spiel eine Low-End-GPU zulegen würden, würden Sie dem Grafik-Rendering die dringend benötigte Rechenleistung entnehmen.
Die Aussichten sind in der Tat großartig, aber wenn Sie ein Spiel machen, anstatt Passwörter zu knacken, überwiegen die praktischen Probleme in den meisten Fällen die Vorteile.
quelle
GPU sind sehr schwer zu programmieren. Sie sollten nach Anleitungen suchen , um eine Liste nach einer GPU zu sortieren . Viele Dissertationen haben die Suche, um es zu tun.
Verwenden Sie eine CPU mit einem Thread ist einfach, verwenden Sie Multi-Threads ist schwieriger, verwenden Sie viele Computer mit paralleler Bibliothek, wie PVM oder MPI ist schwer und verwenden Sie eine GPU ist am schwierigsten.
quelle
Anders als Randolf Richardson antwortete, gibt es einige bestimmte Funktionen, die GPU-Prozessoren nicht alleine bewältigen können. Beispielsweise werden einige der Befehle zur Grafikspeicherverwaltung von der CPU verarbeitet, da die GPU diese nicht verarbeiten kann.
Und es gibt noch einen weiteren wichtigen Grund: Die GPU wurde für Multithread-Berechnungen entwickelt. Dies bedeutet, dass GPU-Hersteller problemlos Kerne hinzufügen können, wenn sie die Rechenleistung erhöhen möchten. Es gibt jedoch viele Aufgaben, die sich nicht in kleinere Probleme wie die Berechnung der n-ten Zahl in der Fibonacci-Reihe unterteilen lassen . In diesen Situationen ist die CPU viel schneller, da sie für Single-Thread-Aufgaben optimiert ist.
quelle
Es gibt viele Antworten, die darauf hindeuten, dass GPUs nur schneller sind, weil sie Aufgaben parallel erledigen. Dies überbewertet das Problem ein wenig. GPUs können aus anderen Gründen effizienter sein, z. B. weil sie einen restriktiveren Speicherzugriff haben, nicht so viele Datentypen unterstützen müssen, weil sie einen effizienteren Befehlssatz haben usw. Frühe GPUs könnten immer noch nur 1 Pixel zeichnen eine Zeit, aber es war die Tatsache, dass sie 1 jeden Zyklus tun konnten, der wichtig war.
Der wirkliche Unterschied besteht darin, dass es sich um zwei verschiedene Maschinentypen handelt, die so angepasst sind, dass sie für verschiedene Aufgabenkategorien gut geeignet sind, die ähnlich erscheinen, sich jedoch tatsächlich erheblich voneinander unterscheiden. Es ist wie ein Flugzeug mit einem Auto zu vergleichen. Das Flugzeug hat eine viel höhere Höchstgeschwindigkeit, aber mehr Einschränkungen bei der Verwendung. In den Fällen, in denen Sie dieselbe Reise mit beiden Arten unternehmen können, scheint das Flugzeug überlegen zu sein.
quelle
Entwickler haben verwenden GPUs für alle Funktionen , die sie gut sind. Sie verwenden CPUs für alle Funktionen, in denen sie gut sind. Was lässt Sie glauben, dass sie es nicht tun?
GPUs eignen sich gut für Aufgaben, die massiv parallelisiert werden können und einen hohen Rechenaufwand erfordern, entweder mit geringem Speicherbedarf oder einer hohen zeitlichen Korrelation mit nur geringen Entscheidungsbeträgen. Dies beinhaltet das Rendern von Bildern, Physiksimulationen (Partikel, Kollision, Stoff, Wasser, Reflexion) und so weiter. Genau dafür nutzen moderne Spiele die GPU.
CPUs eignen sich gut für Aufgaben, die nicht gut parallelisiert werden können und einen hohen Entscheidungsaufwand erfordern. Sie können selbst bei moderater zeitlicher Korrelation hohe Speicheranforderungen tolerieren. Dies umfasst künstliche Intelligenz, Benutzeroberfläche, Festplatten- und Netzwerk-E / A usw. Genau dafür nutzen moderne Spiele die CPU.
quelle
Readback ist ein weiterer Grund, warum ich mir vorstellen kann, gelegentlich die CPU vorzuziehen. Nicht in Bezug auf die Bandbreite (da GPU-> CPU-Bandbreite auf moderner Hardware weniger ein Problem darstellt), sondern in Bezug auf das Stehenbleiben der Pipeline. Wenn Sie Ergebnisse aus einer Berechnung zurückholen und etwas Interessantes oder Nützliches damit tun müssen, ist die Verwendung der GPU keine gute Wahl (im Allgemeinen - es wird Sonderfälle geben, in denen dies angemessen bleiben kann), da das Zurücklesen immer erforderlich ist Die GPU hält an, was immer sie gerade tut, löscht alle ausstehenden Befehle und wartet, bis der Lesevorgang abgeschlossen ist. Dies kann die Leistung insofern beeinträchtigen, als es nicht nur die Vorteile der Verwendung der GPU zunichte macht, sondern auch erheblich langsamer sein kann.
quelle
Dies ist ein alter Thread, aber dieser kürzlich veröffentlichte Artikel könnte diese Frage beantworten. Dieses in ACM Computing Surveys 2015 veröffentlichte Papier zeigt, dass jede der CPUs und GPUs ihre einzigartigen Vorteile hat. Daher wird in diesem Papier der Übergang von der Debatte "CPU vs. GPU" zum Paradigma "CPU-GPU Collaborative Computing" begründet.
Ein Überblick über heterogene CPU-GPU-Rechentechniken
quelle