Graphics Processing Units

Presenter Notes

Resumen

  • Motivación.
  • Pipeline de gráficos.
  • Evolución del pipeline programable.
  • Unified shaders.

Nicolás Wolovick, 20180522

Presenter Notes

Motivación

Presenter Notes

SuperTuxKart >=1.10

Activar el "Artist Debug Mode". Mirar y probar:

  • Cantidad de frames-per-second, KTris de la escena.
  • Activar wireframe para mostrar los triángulos (context menu,
  • Activar el wireframe, normales, cajas de choque (context menu, Bounding boxes).
  • Usar el Fly-mode (I, K) para mirar la escena desde afuera de la esfera celeste.
  • Salir del juego, ir a "Options" y probar los diferentes efectos de los 8 posibles niveles de "Graphical Effects Level".

Probar también los benchmarks de Unigine:

Presenter Notes

¿De dónde vienen?

Ok, las GPUs computan muchísimos números de punto flotante, pero ...
¿De donde salen?

GPUs and CPUs do not go back in computer architecture genealogy to a common ancestor; there is no Missing Link that explains both..

  • Hennessy, Patterson, CAAQA5, p.288.

Presenter Notes

BITBLT

Rutina de Bit Block Transfer, Xerox Alto, 1973.
Opera en un "rectángulo" de la memoria, operando Destination, boolean function, Source, Texture.
Usualmente la función se conocía como ROP Raster OPeration.

  • D ← f(D,S,T)

Bitblt para sprites

A mediados de los 80s aparecen las Commodode Amiga con BITBLT implementado en hardware. Atari ST rápidamente copia el blitter.
La placa VGA original no incorporaba blitter. Pero por ejemplo en 1993 la CL-GD5426 incorpora un blitter.

Presenter Notes

BITBLT y HPC

Idea

Usar el BITBLT de las placas para efectuar operaciones booleanas sobre memoria muy rápidamente.

The blitter made the Amiga popular with enthusiast demo scene programmers. Compared to the MC68000 processor (also found in rival computers of the time) the blitter needed no memory cycles for fetching instructions, no silicon for decoding, and contained a barrel shifter to assist shifting pixel-accurate graphics in bitplanes. It also performed a "4 operand" boolean operation (typically destination:=op(destination, source, mask))

O_O

Este tipo de ideas se mantiene a lo largo de todo el recorrido de hardware-assisted graphics.

Los gráficos de commodity computers pasaron de 2D en los 80s a 3D en los 2000.
Veamos como funciona un graphic pipeline típico para 3D real-time rendering (juegos, 60≤fps).

Presenter Notes

Graphics Pipeline

Presenter Notes

Graphics Pipeline

¿Cómo cada uno de los triángulos contribuye a la imagen final?

Teapot rendeing

(CMU 15-869, Graphics and Imaging Architectures)

Queremos 60 fps en 1920x1080 con profundad de colores de 24bit. Tenemos 16.6ms para transformar, iluminar, cortar, proyectar, pegar texturas y generar los píxeles de:

  • ~1M polígonos (triángulos).
  • Dibujar 6 MiB en el framebuffer.

Historical Polycounts, 2011.

Presenter Notes

Ejemplo de lo que queremos renderear

http://joaquingarreta.blogspot.com.ar/2013/12/game-character.html

Presenter Notes

Tipos de datos que maneja el pipeline

Pipeline entities

(CMU 15-869, Graphics and Imaging Architectures)

Presenter Notes

Real-time graphics pipeline

Real-time graphics pipeline

(CMU 15-869, Graphics and Imaging Architectures)

Presenter Notes

Pipeline, otro esquema

Presenter Notes

Vértices

Un vertex es una tupla con attributes.
Cada attribute tiene components.

Vertex data structure

1 struct vertex {
2     float3 pos; // screen pixel coordinates (sample point location)
3     float3 normal;
4     float2 texcoord;
5 }

(Penn CIS565)

Presenter Notes

Vértices y su ensamblado

Como un MPI_GatherV, pero de información 3D.

Vertex assembly

Vertex assembly

(Penn CIS565)

Presenter Notes

Vertex shader

Función que procesa cada vértice. Mapeo de todo el arreglo de vértices por una función.
También conocido como T&Ltransform and lightning—.

Aplica una matriz de 4x4 que es composición de cuatro matrices:

Wikipedia camera analogy

  1. Posicionar el modelo — modeling transformation.
  2. Posicionar la cámara — viewing transformation.
  3. Ajustar el zoom — projection transformation.
  4. Recortar la imagen — viewport transformation.

Wikibooks, GLSL Programming, Vertex Transformations.

Presenter Notes

Matrices de transformación

Presenter Notes

Vertex Shader, lightning

A partir de:

  • La posición de la(s) fuente(s) de luz.
  • La normal a cada vértice respecto a las fuentes

Se calcula la intensidad de luz que recibe el vértice.

Per vertex lightning

(CMU 15-869, Graphics and Imaging Architectures)

Presenter Notes

Vertex Shader, processing

Transformaciones que modifican (ligeramente) la posición de los vértices.

Ejemplo: pulsing

Vertex pulsing

(Penn CIS565)

Presenter Notes

Vertex Shader, texturas

Texturas pueden ser mapas de altura para desplazamientos de vértices.

Vertex Texure Demo

(Simon Green GeForce 6 Series OpenGL Extensions, 2004?)

Presenter Notes

¿Qué es una textura?

Presenter Notes

Ejemplo de textura

http://joaquingarreta.blogspot.com.ar/2013/12/game-character.html

Presenter Notes

Rasterizing

Rasterization

(Wikibooks, GLSL Programming, Rasterization.)

Presenter Notes

O Rasterizing?

Visual Pipeline

(GLSL Tutorial von Lighthouse3D.)

¿Convierte los vértices o también todos los puntos intermedios?

Presenter Notes

Fragment Shader

Asigna color y textura a cada fragmento o pre-pixel.

Ejemplo: Phong shading

Phong Components

Phong equation

(Wikipedia, Phong reflection model.)

Sumas, productos punto, potencias fraccionarias, multiplicación por constantes.
Un fragment shader puede ser computacionalmente intensivo.

1 float diffuse = max(dot(N, L), 0.0);
2 float specular = max(pow(dot(H, N), u_shininess), 0.0);

Presenter Notes

Fragment Shader: luz y textura

Fragment shader, light and texture

(Penn CIS565)

Presenter Notes

Fragment shader: entrada y salida

1 struct fragment {
2     float x,y; // screen pixel coordinates (sample point location)
3     float z; // depth of triangle at sample point
4     float3 normal;
5     float2 texcoord;
6     // interpolated application-defined attribs
7     // (e.g., texture coordinates, surface normal)
8 }

Después de procesar

1 struct output_fragment {
2     int x,y; // pixel
3     float z;
4     float4 color;
5 }

Presenter Notes

Ejemplos de Cg

Cg es un lenguaje de programación de NVIDIA & Microsoft para shaders.

(está en desuso, hay que mirar GLSL)

Veamos dos ejemplos de OpenGL Examples

Pequeños programitas que actúan de manera independiente en todos los vértices o fragmentos del pipeline gráfico.
(wink)

Presenter Notes

Operaciones en el FrameBuffer

Frame buffer operations

Operado por los ROPs.

(CMU 15-869, Graphics and Imaging Architectures)

Presenter Notes

Ejemplo de Operaciones en el FB

1 if (fragment.z < zbuffer[fragment.x][fragment.y]) {
2     zbuffer[fragment.x][fragment.y] = fragment.z;
3     colorbuffer[fragment.x][fragment.y] =
4     blend(colorbuffer[fragment.x][fragment.y], fragment.color);
5 }

z-buffer example

Además del depth test hay otros: alpha test, stencil test, etc.
(CMU 15-869, Graphics and Imaging Architectures)

Presenter Notes

Parametrización de las operaciones

The graphics pipeline

Uniforms: funciones aridad 0 (constantes).
Textures: funciones aridad 2.

Presenter Notes

Prototipado de shaders

ShaderToy, GLSL Sandbox.

Presenter Notes

Evolución del pipeline programable

Presenter Notes

Evolución del pipeline programable

  • Pre GPU.
  • GPU de funciones fijas.
  • GPU de funciones programables.
  • Shader Processors unificados.
  • GPU Computing.

Presenter Notes

90's

Pre-GPU: Wolfenstein 3D (1992), Doom (1993).

pregpu

Código de CPU optimizado artesanalmente.

Michael Abrash, Graphics Programming Black Book, 1997.

Presenter Notes

3dfx Voodoo (1996)

3dfx Voodoo 1996

(Penn CIS565)

Presenter Notes

NVIDIA GeForce 256 (1999)

NVIDIA GeForce 256 1999

(Penn CIS565)

Presenter Notes

NVIDIA GeForce 3 (2001)

NVIDIA GeForce 3 2001

(Penn CIS565)

Presenter Notes

NVIDIA GeForce 6 (2004)

NVIDIA GeForce 6 2004

(Penn CIS565)

6 vertex shader processors, 16 fragment shader processors, 40 GFLOPS pico.

Presenter Notes

Shader Model 3 (NV40, 2004)

  • Shaders manejan fp32.
  • Vertex shader lee texturas.
  • Programas largos y flujo dinámico de control
  • Se puede dirigir el rendering a los texture buffers.

The modern graphics hardware pipeline

La cena está servida: ¡a computar!

No me interesan: sombras condicionales, mapas de desplazamientos, etc. Yo quiero: GPU particle systems, GPU navier-stokes, etc.

Presenter Notes

GPGPU, un paso intermedio

  • OpenGL 2/DirectX 9, tenían todos los ingredientes para computar.
  • El crecimiento de la potencia de cálculo por año interesó a los científicos.
  • Complicado de programar: entender muy bien el pipeline gráfico, usar texture displacements, usar render to texture.

Programable floating point performance

Presenter Notes

Shader Model 3, comparación

Complete Native Shader Model 3.0 Support

Presenter Notes

Phong Shader, una fuente de luz

¿Como es un programa en GLSL?

Vertex shader

1 varying vec3 N;
2 varying vec3 v;
3 void main(void)
4 {
5    v = vec3(gl_ModelViewMatrix * gl_Vertex);
6    N = normalize(gl_NormalMatrix * gl_Normal);
7    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
8 }

Presenter Notes

Phong Shader, una fuente de luz

Fragment shader

 1 varying vec3 N;
 2 varying vec3 v;
 3 void main (void)
 4 {
 5    vec3 L = normalize(gl_LightSource[0].position.xyz - v);
 6    vec3 E = normalize(-v); // we are in Eye Coordinates, so EyePos is (0,0,0)
 7    vec3 R = normalize(-reflect(L,N));
 8 
 9    //calculate Ambient Term:
10    vec4 Iamb = gl_FrontLightProduct[0].ambient;
11 
12    //calculate Diffuse Term:  
13    vec4 Idiff = gl_FrontLightProduct[0].diffuse * max(dot(N,L), 0.0);
14    Idiff = clamp(Idiff, 0.0, 1.0);
15 
16    // calculate Specular Term:
17    vec4 Ispec = gl_FrontLightProduct[0].specular 
18                 * pow(max(dot(R,E),0.0),0.3*gl_FrontMaterial.shininess);
19    Ispec = clamp(Ispec, 0.0, 1.0);
20 
21    // write Total Color:
22    gl_FragColor = gl_FrontLightModelProduct.sceneColor + Iamb + Idiff + Ispec;
23 }

(Clockworkcoders Tutorials, Per Fragment Lightning.)

Presenter Notes

Unified shaders, GeForce 8800 (G80)

DirectX 10, incorpora geometry shaders (quitar o agregar vértices), luego del vertex shader.
NVIDIA, en vez de agregar más unidades específicas, cambia la arquitectura.

  • Unified general shaders.
  • Recircular información para emular el pipeline.
  • Agregar instrucciones de manejo de enteros.
  • Agregar instrucciones load & store.
  • Organizar los hilos en blocks of threads y grids of blocks.
    • Sincronización de barrera dentro de un bloque.

Presenter Notes

Unified shaders, mejoran los fps

Why Unify 1 Why Unify 2

Presenter Notes

Unified shaders reemplazan el pipeline

8800 replaces pileline model

Presenter Notes

Unified shaders permiten computar

G80 thread unified compute

Presenter Notes

Evolución del pipeline programable

Interactive rendering returns to software?

Presenter Notes

Bibliografía

Presenter Notes

La clase que viene

  • barra-CUDA

Presenter Notes