Information Coding / Computer Graphics, ISY, LiTH. Compute shaders!! Framtiden för GPU computing eller sen efterapning av Direct Compute?

Relevanta dokument
Information Coding / Computer Graphics, ISY, LiTH. Minnesaccess. Vitalt för prestanda! Minnestyper. Coalescing

Information Coding / Computer Graphics, ISY, LiTH CUDA. En lösning för generella beräkningar. En introduktion: Programmingsmodell och språk

Teknik för avancerade datorspel!

Teknik för avancerade datorspel!

TBSK03 Teknik för avancerade Datorspel. Jens Ogniewski Information Coding Group Linköpings universitet

Programmeringsteknik med C och Matlab

Shaders. Gustav Taxén

Procedurell renderingsmotor i Javascript och HTML5

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

Det finns många flaggor till g++,

Geometry shaders! och Tesselation shaders!

Information Coding / Computer Graphics, ISY, LiTH CUDA

Möte 9: Relationer mellan körande processer - (PI)

Övning från förra gången: readword

Geometry shaders! och Tesselation shaders!

DD1361 Programmeringsparadigm. Carina Edlund

Procedurella Grottor TNM084. Sammanfattning. Alexander Steen

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

Programsystemkonstruktion med C++

Operativsystem ID1200/06 Tentamen :00-18:00

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

grundläggande C++, funktioner m.m.

Procedurell 3D-eld på grafikkortet

Recap Mera om nya typer Kort Fält. Programmering. Sommarkurs Verónica Gaspes. IDE-sektionen.

Grafiska pipelinens funktion

En klass behöver både deklaration och definition. Daniel Aarno Globala funktioner och variabler är OK.

Att använda pekare i. C-kod

Innehåll. Pekare Syntax

Första exemplet. Kompilator & länkare. Projekt. Övning 1, Ögrupp 4, Programsystemkonstruktion med C++, Ronnie Johansson,

Synkronisering - Semaforen. Om att vänta men inte i onödan

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Operativsystem. Innehåll. Operativsystemets funktion. Vad är ett OS? Vart hittar men ett OS? OS hanterar processorns resurser

A comparison study between OpenGL 4.3, OpenGL ES 3.0 and WebGL 1.0 With focus on rendering pipeline and texture handling

LUNDS UNIVERSITET. Parallell exekvering av Float32 och INT32 operationer

Tillämpad programmering

Procedurell grottgenerator och eld i GLSL. Marcus Widegren

OOP Objekt-orienterad programmering

Varför behövs grafikbibliotek? Introduktion till OpenGL. OpenGL är ett grafikbibliotek. Fördelar med OpenGL. Allmänt om OpenGL. Nackdelar med OpenGL

Tentamen. Datorteknik och realtidssystem

Datorsystem 5. På denna föreläsning skall vi prata om Operativsystem Exempel på tenta (typ fjolårets)

Arrayer. results

Mälardalens högskola Västerås, Maj 2006 Institutionen för Datavetenskap och Elektronik, IDE Student: Alexander Andersson E-post:

Programmering av grafisk display

HI1024 Programmering, grundkurs TEN

Programmering av grafisk display

lex källkod lex.l lexkompilator lex.yy.c C- kompilator lex.yy.c a.out sekvens av tokens a.out input specifikation av tokens mha reguljära uttryck

Shaders. Renderingssystem. Renderingssystem. Renderingssystem. Hårdvara för 3D-rendering. Hårdvara för 3D-rendering

ID1004 Laboration 3, 5-6 November 2012

HI1024 Programmering, grundkurs TEN

In- och utenheter. Händelsebaserad programmering i GLUT. Interrupt-baserad interaktion. Sampling / polling. Händelsebaserad interaktion (forts.

F5: Högnivåprogrammering

F5: Högnivåprogrammering

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Pekare och arrayer. Indexering och avreferering

Raspberry Pi och Tellstick, ett program i C.

Displaysystem. Hans Brandtberg Saab Avitronics SAAB AVITRONICS

Ett problem. Kontrollstrukturer och arrayer. Arrayer. Lösningen. Arrayer och hakparanteser. Exempel int[] results; results = new int[10]; // 0..

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Summering av fält 1.1. Synkronisering - Semaforen. Summering av fält 1.3. Summering av fält 1.2. Summering av fält 2.3 (INTE GK)

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

... Funktionsanrop. Vad händer när man kör ett program?

Installation av atmel Studio på mac / linux

4 grundregler. Minneshantering. Problemet. Windows minkrav

OOP F1:1. Föreläsning 1. Introduktion till kursen OOP Vad är Java? Ett första Java-program Variabler Tilldelning. Marie Olsson

Filer och structer Del 2

Exempel. Arrayer. Lösningen. Ett problem. Arrayer och hakparanteser. Arrayer

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Blockkedjor. en introduktion för datavetare. Rikard Hjort, 24 maj 2019

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Anteckningar 1: Grundläggande saker

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Dagens föreläsning. Specialtecken. Mer om printf. Formateringssträngar. Mer om scanf. Programmeringsteknik för Ingenjörer VT05

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

TDIU01 - Programmering i C++, grundkurs

C-programmering, föreläsning 2 Jesper Wilhelmsson

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

(2) Skriv ett program som skapar ett antal processer vars relationer beskrivs av nedanstående tidsdiagram a

Datorlaboration 0, Programmering i C++ (EDA623)

Miniprojekt: MEX och molekyldynamik

Avancerad SSL-programmering I

Introduktion till arv

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Manuell installation av SQL Server 2008 R2 Express SP2 fo r SSF Timing

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Objektorientering i liten skala

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

GPGPU - General-Purpose computing on Graphics Processing Units

Föreläsning 7 Strängar

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Planering Programmering grundkurs HI1024 HT data

Demonstration och konsultation Arbetsbokens avsnitt 5 och 6 LCD Grafisk display Introduktion till laboration 3

INSTALLATIONSGUIDE TILL ANDROID UTVECKLINGSMILJÖ

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Tentamen *:58/ID100V Programmering i C Exempel 3

Distribuerade System, HT03

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Parallellism i NVIDIAs Fermi GPU

Transkript:

Compute shaders Framtiden för GPU computing eller sen efterapning av Direct Compute?

Compute shaders Tidigare rent Microsoft-koncept, Direct Compute Numera även i OpenGL, ny shadertyp från OpenGL 4.3

Varför är det viktigt? Varför använda det i stället för CUDA eller OpenCL? + Bättre integration med OpenGL + Ingen extra installation behövs + Enklare att konfigurera än OpenCL + Inte NVidia-specifikt som CUDA + Om du kan GLSL så är Compute Shaders (ganska) lätt

Men det är ju inte bara plus... - Ganska hårda hårdvarukrav Kepler + 4.3 - En del nya koncept - Inte del av grafikpipelinen som fragment shaders Compute shaders är ensamma, kompileras inte med några andra.

OK, hur gör jag? Kompileras som alla andra shaders Modifiera labbkoden från GL_utilities, kompilera (ensam) som GL_COMPUTE_SHADER. Lätta saker: Uniforms fungerar som vanligt Texturer fungerar som vanligt (OBS att man kan skriva till texturer på Fermi och upp)

Vadå skriva till texturer? Japp. (Enbart nyaste GPUerna.) Anrop i shader: imagestore() imagestore(texunit, texcoord, color); Farligt Risk för racing Därför finns nytt anrop för synkronisering: glmemorybarrier() samt memorybarrier() i shaders. GLSL går mot allt generellare arkitektur - men frihet gör det inte lättare. Tillbaka till Compute Shaders...

Lite annorlunda Attribut finns inte Inte en tråd per fragment Shader Storage Buffer Objects: Generell buffertyp för godtyckliga data Kan deklareras så shadern ser det som en array av strukturer Kan läsas och skrivas fritt av Compute Shaders

Hur får jag in indata? Ladda upp till SSBO: glgenbuffers(1, &ssbo); glbindbuffer(gl_shader_storage_buffer, ssbo); glbufferdata(gl_shader_storage_buffer, size, ptr, GL_STATIC_DRAW); Hur får shadern veta om den? glbindbufferbase(gl_shader_storage_buffer, id, ssbo); layout(std430, binding = id, buffer x {type y[];};

Hur accessar jag data i shadern? Bestäm antal trådar per block: layout(local_size_x = width, local_size_y = height) Trådnummer: gl_globalinvocation gl_localinvocation void main() { buffer[gl_globalinvocation.x] = - buffer[gl_globalinvocation.x]; }

Hur kör jag kärnan? gluseprogram(program); gldispatchcompute(sizex, sizey, sizez); Argumenten till gldispatchprogram anger antalet block / workgroups. Antal trådar (work items) per block anges av shadern.

Hur får jag ut utdata? glbindbuffer(gl_shader_storage, ssbo); ptr = (int *) glmapbuffer(gl_shader_storage, GL_READ_ONLY); Läs sedan från ptr[i] glunmapbuffer(gl_shader_storage);

Komplett huvudprogram: int main(int argc, char **argv) { glutinit (&argc, argv); glutcreatewindow("test1"); // Load and compile the compute shader GLuint p =loadshader("cs.csh"); GLuint ssbo; //Shader Storage Buffer Object // Some data int buf[16] = {1, 2, -3, 4, 5, -6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; int *ptr; // Create buffer, upload data glgenbuffers(1, &ssbo); glbindbuffer(gl_shader_storage_buffer, ssbo); glbufferdata(gl_shader_storage_buffer, 16 * sizeof(int), &buf, GL_STATIC_DRAW); // Tell it where the input goes // "5" matches "layout" in the shader. glbindbufferbase(gl_shader_storage_buffer, 5, ssbo); // Get rolling gldispatchcompute(16, 1, 1); // Get data back glbindbuffer(gl_shader_storage_buffer, ssbo); ptr = (int *)glmapbuffer( GL_SHADER_STORAGE_BUFFER, GL_READ_ONLY); for (int i=0; i < 16; i++) { printf("%d\n", ptr[i]); } }

Enkel Compute Shader: #version 430 #define width 16 #define height 16 OBS: Egentligen alldeles för mycket trådar för data (16*16*16) // Compute shader invocations in each work group layout(std430, binding = 5) buffer bbs {int bs[];}; layout(local_size_x=width, local_size_y=height) in; //Kernel Program void main() { int i = int(gl_localinvocationid.x * 2); bs[gl_localinvocationid.x] = -bs[gl_localinvocationid.x]; }

Detta kan jag inte täcka nu: Shared memory och synkronisering Skicka buffrar mellan Compute Shader och grafikpipeline Prestanda jämfört med CUDA/OpenCL

Kan du köra Compute Shaders? Krav: OpenGL 4.3 + Kepler 600-serien och uppåt... men se upp, en del 600 är Fermi Ännu nyare: Inga problem.

Tror vi på Compute Shaders? Portabelt mellan olika grafikkort och OS Hårda hårdvarukrav - men mindre och mindre Alla fördelar i framtiden?

Projekt med Compute Shaders? Varför inte - om du har ett problem stort nog. Demodator går att ordna (min).