31
Architektur und Programmierung von Grak- und Koprozessoren Die Grak Pipeline Stefan Zellmann Lehrstuhl fur Informatik, Universit at zu Koln SS2018

Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

Architektur und Programmierung von Grafik- undKoprozessorenDie Grafik Pipeline

Stefan Zellmann

Lehrstuhl fur Informatik, Universitat zu Koln

SS2018

Page 2: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 3: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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);

}

Page 4: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

Vertex Shader

Benutzerdefinierte per Vertex Attribute:

in vec3 position;

in mat4 view_mat;

in mat4 proj_mat;

attribute vec3 normal;

void main() {

...

transform(normal );

...

}

Page 5: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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() {

...

}

Page 6: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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);

}

Page 7: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 8: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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);

Page 9: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 10: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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

Page 11: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 12: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 13: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

Historische Entwicklung von Grafikprozessoren

Page 14: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 15: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 16: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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

Page 17: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

“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.

Page 18: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 19: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 20: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 21: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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

Page 22: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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")

Page 23: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 24: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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).

Page 25: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 26: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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

Page 27: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

Skalierbarkeit von GPU Architekturen

Page 28: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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

Page 29: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

CPUs vs. GPUs

ControlALUALU ALUALU

ALUALU ALUALU

Cache

DRAM DRAM

CPU GPU

Abbildung: vgl. Modern GPU Architecture, Roger Crawfis, Game Designand Project.

Page 30: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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.

Page 31: Architektur und Programmierung von Grafik- und ... · Vertex Texture Fetch Cull/Clip/Setup Vertex Input Primitive Assembly Viewport Processing Texture Cache Abbildung:vgl. GPU Gems

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