Unterschiedliche GPUs verwenden unterschiedliche Tricks und Techniken, sodass diese Antwort absichtlich sehr allgemein gehalten wird und einige Details möglicherweise nicht für einige GPUs in der Vergangenheit, Gegenwart (2017) und Zukunft gelten.
Dies gilt hauptsächlich für Personal Computer-GPUs. GPUs für Mobiltelefone (Telefone, Tablets) versuchen, intelligenter und weniger verschwenderisch zu sein und Speicherbandbreite zu sparen, folgen jedoch einem ähnlichen Prozess. Wenn Sie alle GPUs detailliert behandeln, erhalten Sie eine sehr lange Antwort.
Die Rendering-Phasen sind absichtlich nicht in Ordnung.
Fett gedruckt sind die Teile, die die Parallelität abdecken
Die Phasen können in einer Pipeline ausgeführt werden, in der der nächste Zeichnungsaufruf verarbeitet wird, bevor der vorherige abgeschlossen ist, und während andere GPU-Kerne zeichnen.
Pixel zeichnen
Moderne GPUs zeichnen nicht mehr ein Dreieck als das nächste. Es ist viel komplizierter, die Parallelität zu maximieren:
GPUs teilen die Zeichnung in WxH-Kacheln auf (dies hängt von der GPU ab, aber für unser Beispiel gehen wir mit 8x8).
Jede Kachel kann unabhängig vom Zeichenmodus von der GPU parallel gezeichnet werden.
GPU-Kerne sind (normalerweise) in Gruppen von BxH (z. B. 8x8 = 64 Kerne) angeordnet, die der Kachel entsprechen. Eine Gruppe kann auf eine Kachel rendern, während die andere eine andere Kachel rendert .
Die gesamte Gruppe führt denselben Shader zur gleichen Zeit aus. Rendern auf alle Pixel der Kachel gleichzeitig . Wenn einige Pixel nicht gezeichnet werden sollen (dh das Dreieck bedeckt nur einen Teil der Kachel), werden diese Kerne weiterhin ausgeführt, jedoch in einem deaktivierten Modus, der das Ergebnis ignoriert und nichts schreibt. Mobile GPUs arbeiten häufig mit kleineren Kerngruppen zusammen, um weniger verschwenderisch zu sein und gleichzeitig mehrere Pixel in der Kachel zu rendern.
Auf einigen GPUs werden zwei oder mehr nicht überlappende Dreiecke , die denselben Shader verwenden, der in demselben Zeichnungsaufruf für dieselbe Kachel gerendert wurde, kombiniert und gleichzeitig in dieser Kachel gerendert .
Andere GPUs müssen für jedes Dreieck einen Durchgang durchführen.
Dies bedeutet, dass im schlimmsten Fall, wenn Sie ein Dreieck mit einer Größe von 1 Pixel haben, 1 Kern in der Gruppe etwas Nützliches zeichnet und die anderen 63 Kerne in der Kachel im Modus "Ergebnis ignorieren" "nichts" tun.
Scheitelpunkte transformieren
Dieselben Kerngruppen (einheitliche GPU) verarbeiten auch eingehende Scheitelpunkte (Scheitelpunkt-Shader).
Eingehende Scheitelpunktstapel werden jeweils N Scheitelpunkte verarbeitet (z. B. 64 oder ein Vielfaches davon in unserer obigen 8x8-Kernanordnung) und in einen transformierten temporären Puffer ausgegeben.
Die GPU kann mit der Transformation von Scheitelpunkten des nächsten Zeichnungsaufrufs beginnen, bevor die erste Transformation abgeschlossen ist, sodass die Scheitelpunktarbeit an verschiedenen Zeichnungsaufrufen parallel ausgeführt werden kann .
Clipping & Geometry Shader
Die temporären Ausgaben der Scheitelpunkttransformation werden ausgewählt und in weitere Dreiecke geschnitten. Optional wird vor dem Abschneiden ein Geometrie-Shader ausgeführt und in einen weiteren temporären Puffer geschrieben.
Jede Pufferverarbeitung aus der Scheitelpunkttransformation kann parallel ausgeführt werden.
GPU-Treiber können Vertex-, Geometrie- und / oder Clipping-Phasen intern zu einer Shader-Programm-Ausführungsstufe kombinieren.
Fliesen Dreieck Eimer
Die transformierten und abgeschnittenen Dreiecke werden in "Eimer" (Listen, Arrays, Kreispuffer oder andere Methoden) jeder Kachel gelegt, die sie abdecken. Ein Bucket für jede Renderkachel oder mehr (kann einer pro Shader in einer Warteschlange sein, abhängig von GPU und Treiber).
Wenn eine Kachel bereit ist, eine GPU-Kerngruppe zu zeichnen, "greift" sie aus der Warteschlange und beginnt mit dem Zeichnen dieser Kachel. Die nächste GPU-Kerngruppe kann die nächste Kachel greifen und so weiter ...
Es gibt im Wesentlichen zwei Möglichkeiten:
- Wenn Dreiecke eingehen, werden sie in die Kacheleimer geschoben, und GPU-Kerngruppen "greifen" nach der Kachel, wenn sie kommen, und zeichnen die Dreiecke in der Liste.
- Alle Dreiecke werden zuerst in Kacheleimer sortiert, und dann beginnen die GPU-Kerne zu zeichnen.
Das Obige hängt oft davon ab, ob es sich um eine Handy- (mobile) GPU oder eine Desktop- / Laptop-GPU handelt, aber nicht unbedingt.
Bei einigen GPUs wird diese Bucketing-Arbeit von einer oder mehreren Master-Koordinator-CPUs innerhalb der GPU ausgeführt, die alle "dümmeren" (aber besser zum Zeichnen von Pixeln) GPU-Kerngruppen koordinieren und ihnen mitteilen, was wann zu tun ist.
Bei anderen GPUs sind die Kerne allgemeiner und in der Lage, dies selbst oder zumindest einen Teil dieser Koordinierungsarbeit zu tun.
Auf einigen Maschinen wird diese Koordinierungsarbeit von der Hauptcomputer-CPU selbst ausgeführt.
Auf anderen (älteren oder integrierten GPU-) Computern werden die Scheitelpunkt-, Geometrie- und Beschneidungsarbeiten von der CPU selbst ausgeführt, und die GPU-Kerne erledigen nur Pixel-Shader-Arbeiten.
Die gesamte Arbeit wird in kleine Arbeitslasten und so viele Stufen wie möglich (und praktisch) unterteilt, um die Parallelität zu maximieren und ein Gleichgewicht zwischen Parallelität und Koordinierungskosten zu finden.