Architektur und Programmierung von Grafik- undKoprozessorenDie Grafik Pipeline
Stefan Zellmann
Lehrstuhl fur Informatik, Universitat zu Koln
SS2018
Vertex Shader
Einfacher Vertex Shader (lose basierend auf OpenGL ShadingLanguage (GLSL)) . Applikation verwaltet ViewingTransformationsmatrix und perspektivische Transformationsmatrixund ubergibt sie an alle Vertex Shader Instanzen.
in vec3 position;
in mat4 view_mat;
in mat4 proj_mat;
void main() {
gl_Position = view_mat * proj_mat * vec4(position , 1.0);
}
Vertex Position aus Vertex Buffer bekannt. Vertex Shader fuhrtTransformation durch.
Vertex Shader
Benutzerspezifische Vertex Attribute:
in vec3 position;
in mat4 view_mat;
in mat4 proj_mat;
in float time;
void main() {
position.x += cos(time);
position.y += sin(time);
gl_Position = view_mat * proj_mat * vec4(position , 1.0);
}
Vertex Shader
Benutzerdefinierte per Vertex Attribute:
in vec3 position;
in mat4 view_mat;
in mat4 proj_mat;
attribute vec3 normal;
void main() {
...
transform(normal );
...
}
Vertex Shader
Vertex Output geht spater durch Raster Engines ⇒benutzerdefinierte Attribute werden wahrend ScanKonvertierung interpoliert!
varying: interpolierte Attribute stehen spater in Fragment Phasezur Verfugung.
in vec3 position;
in mat4 view_mat;
in mat4 proj_mat;
varying vec3 normal;
varying vec2 uv;
void main() {
...
}
Fragment Shader
Einfacher Fragment Shader mit diffusem Beleuchtungsmodell.varying Attribute aus Vertex Shader. Fragment-spezifischer Input(z. B. light dir).
// Simple diffuse shader
in sampler2D tex;
in vec3 light_dir;
varying vec3 normal;
varying vec2 uv;
out vec4 frag_color;
void main() {
// 2-D texture access
vec3 diff = tex2D(tex , uv);
// Simple (single -sided) Lambert shading
diff *= max(0.0, dot(light_dir , normal ));
// Write result
frag_color = vec4(diff , 1.0);
}
Shader Programme
I Neue APIs: mehr programmierbare Pipeline Stages.I Geometrie Shader: folgen auf Vertex Stage. Programmatisch
Erzeugung weiterer Polygone.I Tesselation Shader: niedrig aufgeloste Geometrie kann durch
Tesselierung verfeinert werden, z. B. mit Bezier Patches(Subdivision Surface Algorithmen).
I Weitere programmierbase Stages z. B. im Zusammenhang mitMultisampling.
I Wir gehen vereinfachend nur von Vertex und FragmentShadern aus.
Shader Programme
Shader werden zur Programmlaufzeit kompiliert und gelinkt.
GLuint vs = glCreateShader(GL_VERTEX_SHADER );
GLuint fs = glCreateShader(GL_FRAGMENT_SHADER );
glShaderSource(vs, strlen(vert_shader_str),
vert_shader_str , 0);
glCompileShader(vs);
glShaderSource(fs, strlen(frag_shader_str),
frag_shader_str , 0);
glCompileShader(fs);
GLuint prog = glCreateProgram ();
glAttachShader(prog , vs);
glAttachShader(prog , fs);
glLinkProgram(prog);
glUseProgram(prog);
Shader Programme
I Laufzeitkompilation und Linking.I Laufzeit Overhead (wegen Caching meistens nur erster
Programmlauf).I OpenGL Runtime muss Compiler integrieren.I Traditionell sehr fehleranfallig - IHVs (Independent Hardware
Vendors) legen Sprachstandard unterschiedlich aus.I Treiber muss Compiler-generierten Intermediarcode in
Maschinencode ubersetzen.I Shader Programme stehen im Klartext im Binary, konnen
einfach mit Hex-Editor ausgelesen werden.
I Vulkan API: Shader werden zur Compile Zeit in optimiertenIntermediarcode (SPIR-V) ubersetzt.
Hierarchische Pipeline
Alte Versionen von Direct3D und OpenGL hatten hierarchischePipelines:
I Stack fur Transformationsmatrizen.
I Stack fur generellen State.
I Wende Transformationen / Materialien etc. auf Teile derGeometrie an, indem State / Transformationen auf Stackgepushed werden. Wenn entsprechende Teile der Geometriegezeichnet, poppe vom Stack
Hierarchische Pipeline
Neue APIs gehen davon aus, dass die Applikation denhierarchischen State samt Transformationen verwaltet (z. B.Szenengraph Bibliothek), und dass Transformationen als uniformeVariablen an Shader Instanzen ubergeben werden.
Kompletter Matrix Stack in OpenGL deprecated. VieleBetriebssystemhersteller (insb. Microsoft, Apple) unterstutzen nursehr alte OpenGL Versionen, daher noch viel legacy Code, der aufalten OpenGL Konzepten aufbaut.
API Erweiterungen
I Unterschiedliche Dynamik:
I Direct3D: Microsoft entscheidet im wesentlichen, schnelleDeprecation Mechanismen, schnelle Assimilation neuerFeatures.
I OpenGL (Khronos Group API): API unterstutzt Extensions.Lade Extension per Function Pointer aus Treiber (wenn nichtvorhanden, ist FP nach laden NULL).
I OpenGL Extension Review Mechanismus:I erst Vendor: NV shader thread group,
AMD multi draw indirect etc.I dann Extension (z. B. wegen Konsens mehrerer Vendors:
EXT sparse texture2.I im Verlauf entscheidet ggf. Architecture Review Board (ARB),
ob Extension sinnvoll: ARB bindless texture.I Zum Schluss wird Extension ggf. Teil des Core Profils.
I Deprecation bei OpenGL ahnlich langwierig.
Historische Entwicklung von Grafikprozessoren
Grafikbeschleuniger
I 1993 - SGI Grafik Workstations.I 1996–1998 - Grafikprozessoren:
I 3dfx Voodoo & Voodoo2.I Nvidia Riva TNT & TNT2.
I 1999 - Nvidia GeForce 256 (“GPU”).I 2006 - Nvidia GeForce 8800 GTX
I “Unified Shader Architecture”.I 2007 - CUDA, G80 Chip erste CUDA-fahige GPU.
I 2007 - Nvidia Tesla (vermarktet als “GPU ohneGrafikausgang, basiert auf G80 Chipsatz, zielte auf HighPerformance Computing Markt ab).
I 2009 - Nvidia Fermi Architektur: double-precisionBerechnungen, single-precision fused multiply-add.
Grafik Pipeline
Vertex Specification
Vertex Processing
Primitive Assembly
Rasterization
Fragment Processing
Per-Sample Operations
I High-level und generisch, je nachSpezifikation, Architektur oderHersteller ggf. anders.
I Per-Sample vs. per-Pixel:Multi-Sampling.
I Rasterization: manchmal derAlgorithmus Rasterisierung,manchmal nur Scan Konvertierung.Bei Diskussion der HardwarePipeline Begriff Rasterizationgebrauchlicher, meint hier: nurScan Konvertierung.
Grafikprozessoren um 1993
Vertex Specification
Vertex Processing
Primitive Assembly
Rasterization
Fragment Processing
Per-Sample Operations
CPU
PCI
Framebuffermemory
Texture memory
Bruce
RAMDACFramebuffer Interface
Bruce
Chuck
Texture managementunits
SLI
Abbildung: vgl. VOODOO2 Graphics High Performance Graphics EngineFor 3D Game Acceleration (Rev. 1.16, Dec 1, 1999), 3Dfx Interactive
“GPU” um 1999
Vertex Specification
Vertex Processing
Primitive Assembly
Rasterization
Fragment Processing
Per-Sample Operations
CPUAGP x4
GPU
SLI
Abbildung: z. B. Nvidia GeForce 256, vermarktet als Graphics ProcessingUnit (GPU). Erster Koprozessor, der Vertex Verarbeitung und PixelOperationen abbildete. OpenGL 1.2, DirectX 7.
GPUs um 2003
Vertex Specification
Vertex Processing
Primitive Assembly
Rasterization
Fragment Processing
Per-Sample Operations
CPUAGP x8
VP VP VP VP VP
Cull/Clip/Setup
RasterizationEarly-Z
FP FP FP FP FP FPFragment Crossbar
z-Test & Blending
Abbildung: vgl. GPU Gems 2: The GeForce 6 Series GPU Architecture.Erste Generation von GPUs mit frei programmierbaren Vertex undFragment Stages, dedizierten Vertex- und Fragmentprozessoren mitBranching Units, breiter 256-bit Memory Bus etc.
GPUs um 2003
VP VP VP VP VP
Cull/Clip/Setup
RasterizationEarly-Z
FP FP FP FP FP FPFragment Crossbar
z-Test & Blending
fp32 Shader Unit
vec4 Shader Unit
Branch Unit
Vertex Texture Fetch
Cull/Clip/Setup
Vertex Input
Primitive Assembly
Viewport Processing
Texture Cache
Abbildung: vgl. GPU Gems 2: The GeForce 6 Series GPU Architecture.
GPUs um 2003
VP VP VP VP VP
Cull/Clip/Setup
RasterizationEarly-Z
FP FP FP FP FP FPFragment Crossbar
z-Test & Blending
fp32 Shader Unit 1
fp32 Shader Unit 2
Branch Processor
Fog ALU
fp Texture Processor
Texture Cache
Shaded Fragment
Fragment InputTexture Input
Abbildung: vgl. GPU Gems 2: The GeForce 6 Series GPU Architecture.FP verarbeitet vier Pixel auf ein Mal (fur Texture Derivatives). SIMDFragment Verarbeitung hunderter Fragmente, versteckt Latenz furTexture Fetch.
Traditionelle GPU Pipeline
Traditionelle Architekturen hatten separate Vertex und FragmentProzessorkerne. Dies fuhrte zu Lastimbalanzen, falls die Anzahl anDreiecken und Fragmenten nicht gleich verteilt war.
Vertex Processor Fragment Processor
Moderne GPU Pipeline
Moderne GPUs verfugen uber sog. Unified Shader Kerne, diegenereller als die alten Vertex und Fragment Kerne sind und beideAufgaben ubernehmen konnen.
General Purpose Processor ("Unified Shader")
Moderne GPU Pipeline
I Ausgehend davon (State Machine + Unified ShaderArchitektur) wollen wir uns spater anschauen, wie moderneArchitekturen den Weg vom Dreieck zum Bildschirmpixelhardwareseitig implementieren.
I Dabei betrachten wir den Weg vom CPU Programm (z. B.C/C++ API) uber das Betriebssystem, den Grafikbus und dieGPU bis zur Anzeige.
Unified Shader GPUs um 2007
Vertex Specification
Vertex Processing
Primitive Assembly
Rasterization
Fragment Processing
Per-Sample Operations
CPUPCIe
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
FB FB FBFB
L2 L2 L2 L2
Abbildung: vgl. Technical Brief: NVIDIA GeForce 8800 GPU ArchitectureOverview, November 2006 TB-02787-001 v0.9. Streaming Architektur,Shader Cores ubernehmen diverse Aufgaben, u. a. auch Geometry Shader(neu).
Unified Shader GPUs um 2007
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
SP
TA TA TA TA
TF TF TF TF
L1 Cache
I Unified Shader Core:I Streaming Prozessoren
(SP).I Texture Address Units
(TA).I Texture Filtering Units
(TF).
I Volliges Uberlappen vonTexture Fetch und MathInstructions ⇒ ExtremesVerstecken vonSpeicherzugriffslatenz.
2009: Double Precision Berechnungen
Register File
Core
INTALU
FPALU
Result Queue
Instruction Cache
Scheduler Scheduler
Interconnect
L1/Shared Mem
SFU
SFU
SFU
SFU
Nvidia’s Fermi Architektur: “Special Function Units” furTrigonometrie etc.; Hardware double-precision Support; Supportfur 32-bit IEEE-754 compliant fused multiply-add (a * b + c ineiner Instruktion).1
1vgl. Whitepaper: NVIDIA’s Next Generation CUDA Compute Architecture:Fermi
Skalierbarkeit von GPU Architekturen
CPUs vs. GPUs
CPU
I Hohe Taktfrequenz
I Moderat viele Cores
I Moderat tiefe Pipelines
I Große Caches, BranchPrediction Units,Out-of-Order Execution
GPU
I Niedrige Taktfrequenz
I Viele Cores
I Sehr tiefe Pipelines
I Fur hohen Durchsatzoptimiert, Speicher- undsonstige Interfaces mit hoherBandbreite und hoherLatenz. “Latency Hiding”uber Durchsatz
CPUs vs. GPUs
ControlALUALU ALUALU
ALUALU ALUALU
Cache
DRAM DRAM
CPU GPU
Abbildung: vgl. Modern GPU Architecture, Roger Crawfis, Game Designand Project.
Anforderungen an Skalierbarkeit
I GPUs sind hochparallele Architekturen. Dies außert sichjedoch nicht bloß darin, dass GPUs extrem viele Kerne aufeinem Die unterbringen.
I Anforderungen an Skalierbarkeit entlang der gesamtenPipeline. Skaliert eine Pipeline Stage nicht mit zunehmenderEingabedatenmenge, beeinflusst das die gesamte Pipeline.
I GPUs haben programmierbare Funktionseinheiten (ShaderProzessoren / Shader Cores) und nicht-programmierbareFunktionseinheiten (Textureinheiten, Raster Engines, RenderOutput Units (ROPs)).
I Außerdem “Host Interface”: Treiber, Command Prozessoren,etc.
I GPU Architektur muss Skalierbarkeit bzgl. all dieser Einheitengewahrleisten.
Anforderungen an Skalierbarkeit
Insb. muss Skalierbarkeit bzgl. der folgenden Schlusselmetriken 2
gewahrleistet sein:
I Eingabedatenrate: Rate, mit der Kommandos und Geometriean die GPU geschickt werden konnen.
I Dreiecksrate: Rate, mit der Geometrie transformiert, geclippedund als Dreiecke an Raster Engines geschickt wird.
I Pixelrate: Rate, mit der Raster Engines Dreiecke zuFragmenten rastern, diese texturiert und zusammensetzen(Compositing).
I Texturspeicher: Große der maximal nutzbaren Texturen.
I Display Bandbreite: Bandbreite, mit der Pixel ausGrafikspeicher an Displays verteilt werden konnen.
2vgl. Pomegranate: A Fully Scalable Graphics Architecture, Eldridge et al.Siggraph 2000