M2-Images. Rendu Temps Réel - OpenGL 4 et compute shaders. J.C. Iehl. December 18, 2013



Documents pareils
TPs Architecture des ordinateurs DUT Informatique - M4104c SUJETS. R. Raffin Aix-Marseille Université romain.raffin-at-univ-amu.fr

Introduction à CUDA.

Une bibliothèque de templates pour CUDA

Introduction à la programmation concurrente

Introduction à la Programmation Parallèle: MPI

Synthèse d'images I. Venceslas BIRI IGM Université de Marne La

4. Outils pour la synchronisation F. Boyer, Laboratoire Lig

Génération de code binaire pour application multimedia : une approche au vol

Rendu temps réel de mer et de nuages

<Insert Picture Here> Solaris pour la base de donnés Oracle

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

Problèmes liés à la concurrence

Exercices sur SQL server 2000

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

GPGPU. Cours de MII 2

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

Introduction à MATLAB R

3615 SELFIE. HOW-TO / GUIDE D'UTILISATION

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

AMENDMENT TO BILL 32 AMENDEMENT AU PROJET DE LOI 32

I. Programmation I. 1 Ecrire un programme en Scilab traduisant l organigramme montré ci-après (on pourra utiliser les annexes):

. Plan du cours. . Architecture: Fermi ( ), Kepler (12-?)

Paxton. ins Net2 desktop reader USB

Reconstruction de bâtiments en 3D à partir de nuages de points LIDAR

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

APPENDIX 6 BONUS RING FORMAT

Temps Réel. Jérôme Pouiller Septembre 2011

Compléter le formulaire «Demande de participation» et l envoyer aux bureaux de SGC* à l adresse suivante :

Bill 69 Projet de loi 69

TD2/TME2 : Ordonnanceur et Threads (POSIX et fair)

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

RIE LE RENDU THEO. 2 e trim ÉTAPE DE FINITION BOÎTE DE DIALOGUE. remarques

Initiation au HPC - Généralités

Interest Rate for Customs Purposes Regulations. Règlement sur le taux d intérêt aux fins des douanes CONSOLIDATION CODIFICATION

Segmentation d'images à l'aide d'agents sociaux : applications GPU

MELTING POTES, LA SECTION INTERNATIONALE DU BELLASSO (Association étudiante de lʼensaparis-belleville) PRESENTE :

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Règles et paramètres d'exploitation de Caparmor 2 au 11/12/2009. Pôle de Calcul Intensif pour la mer, 11 Decembre 2009

Les processus légers : threads. Système L3, /31

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

FÉDÉRATION INTERNATIONALE DE NATATION Diving

Calculation of Interest Regulations. Règlement sur le calcul des intérêts CONSOLIDATION CODIFICATION. Current to August 4, 2015 À jour au 4 août 2015

INF6500 : Structures des ordinateurs. Sylvain Martel - INF6500 1

Differential Synchronization

Recherche dans un tableau

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Form of Deeds Relating to Certain Successions of Cree and Naskapi Beneficiaries Regulations

4. Groupement d objets

Une introduction à Java

Compléments de documentation Scilab : affichage de texte et formatage de nombres

Multiple issuers. La cotation des actions ROBECO ci-dessous est suspendue sur EURONEXT PARIS dans les conditions suivantes :

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

Frequently Asked Questions

MapReduce. Malo Jaffré, Pablo Rauzy. 16 avril 2010 ENS. Malo Jaffré, Pablo Rauzy (ENS) MapReduce 16 avril / 15

Stakeholder Feedback Form January 2013 Recirculation

Fédération Internationale de Handball. b) Règlement du but

CEPF FINAL PROJECT COMPLETION REPORT

Master Développement Durable et Organisations Master s degree in Sustainable Development and Organizations Dossier de candidature Application Form

Guide d installation Deco Drain inc. DD200

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

INDIVIDUALS AND LEGAL ENTITIES: If the dividends have not been paid yet, you may be eligible for the simplified procedure.

Développement Logiciel

22/09/2014 sur la base de 55,03 euros par action

Guide d'installation rapide TFM-560X YO.13

Cours d algorithmique pour la classe de 2nde

EN UNE PAGE PLAN STRATÉGIQUE

Plan du cours Cours théoriques. 29 septembre 2014

Order Binding Certain Agents of Her Majesty for the Purposes of Part 1 of the Personal Information Protection and Electronic Documents Act

AUDIT COMMITTEE: TERMS OF REFERENCE

Application Form/ Formulaire de demande

RULE 5 - SERVICE OF DOCUMENTS RÈGLE 5 SIGNIFICATION DE DOCUMENTS. Rule 5 / Règle 5

Développement d un moteur de jeu vidéo pour la console Nintendo Wii U et portage d un jeu

4. Outils pour la synchronisation F. Boyer, Laboratoire Sardes

RAPID Prenez le contrôle sur vos données

Quick Start Guide This guide is intended to get you started with Rational ClearCase or Rational ClearCase MultiSite.

Bases de programmation. Cours 5. Structurer les données

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

TP11 - Administration/Tuning

Initiation à la programmation en Python

Faits saillants et survol des résultats du sondage

Exécutif temps réel Pierre-Yves Duval (cppm)

Vers du matériel libre

that the child(ren) was/were in need of protection under Part III of the Child and Family Services Act, and the court made an order on

Guide d'installation et de configuration de Pervasive.SQL 7 dans un environnement réseau Microsoft Windows NT

XtremWeb-HEP Interconnecting jobs over DG. Virtualization over DG. Oleg Lodygensky Laboratoire de l Accélérateur Linéaire

Laboratory accredited by the French Home Office (official gazette date February 5 th, 1959, modified) Valid five years from August 27 th, 2013

DOCUMENTATION MODULE BLOCKCATEGORIESCUSTOM Module crée par Prestacrea - Version : 2.0

Plan 1/9/2013. Génération et exploitation de données. CEP et applications. Flux de données et notifications. Traitement des flux Implémentation

Configurer la supervision pour une base MS SQL Server Viadéis Services

Approche Contract First

Principes. 2A-SI 3 Prog. réseau et systèmes distribués 3. 3 Programmation en CORBA. Programmation en Corba. Stéphane Vialle

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Practice Direction. Class Proceedings

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

Le passé composé. C'est le passé! Tout ça c'est du passé! That's the past! All that's in the past!

Chapitre V. Les classes : Object, Vector, etc.

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

Transcription:

Rendu Temps Réel - OpenGL 4 et compute shaders December 18, 2013

résumé des épisodes précédents... création des objets opengl, organisation des données, configuration du pipeline, draw,... opengl 4.3 : nouveau type de shader : compute shader

c est quoi : un shader qui ne s execute pas dans le pipeline graphique, pas de vertex buffer, pas de framebuffer,... mais des uniforms, des buffers, des textures, des images en entrée... et en sortie!

à quoi ca sert : à faire autre chose que de l affichage? de la simulation? du culling/élimination des parties cachées? à aller plus vite? cf programmation générique parallèle des processeurs graphiques

Création et exécution création : glcreateshader(gl COMPUTE SHADER); seul shader présent dans un programme, le reste est classique : glcreateprogram(), glattachshader(), gllinkprogram() draw? non, le compute shader ne dessine rien, il s exécute pour traiter des données : gldispatchcompute(... ); mais on peut produire une image / texture...

euh, et les résultats? les resultats : sont stockés dans des objets opengl classiques : des buffers ou des textures selon le cas. et les entrées sont des uniform, des buffers et des textures.

parallélisme de données : exécuter une tache / un thread par donnée à traiter, au lieu d écrire une boucle pour traiter chaque donnée. quoi? même chose que les autres types de shaders : transformer tous les sommets, calculer la couleur de tous les fragments, etc. mais les différents threads peuvent communiquer!

exemple # version 430 // core profile, compute shader uniform mat4 mvpmatrix ; layout ( binding = 0 ) // buffer 0: contient un tableau de position readonly buffer positiondata // nom du buffer pour l application, // cf glgetprogramresourceindex et glbindbufferbase () { vec3 position []; }; layout ( binding = 1) // buffer 1: tableau de positions transformees writeonly buffer transformeddata { vec4 transformed []; }; layout ( local_size_x = 32 ) in; void main ( ) { int i= gl_globalinvocationid ; transformed [i]= mvpmatrix * vec4 ( position [i], 1.0) ; }

Espace d itération en pratique : les threads sont exécutés par groupes, l espace d itération est découpé en groupes, et chaque groupe est composé de plusieurs threads : gldispatchcompute( num groups ); // opengl layout( local size= 32 ) in; // glsl pourquoi? ressources partagées par les threads d un groupe : mémoire... processeur : unités de calculs, instructions, cache, etc.

Espace d itération et indexation des threads limites : nombre max de groupes : glget(gl MAX COMPUTE WORK GROUP COUNT), nombre max de threads par groupe : glget(gl MAX COMPUTE WORK GROUP SIZE), memoire partagée accessible aux threads d un groupe : glget(gl MAX COMPUTE SHARED MEMORY SIZE)

Espace d itération exemple : transformer les sommets de bigguy : 1754 positions, groupes de 32 threads (arbitraire), donc 1754 / 32 (+1) groupes nécessaires.

Espace d itération et indexation des threads indexation des threads : gl GlobalInvocationID : indice du thread dans l ensemble, == gl WorkGroupID * gl WorkGroupSize + gl LocalInvocationID, gl WorkGroupID : indice du groupe, gl LocalInvocationID : indice du thread dans le groupe, gl WorkGroupSize : nombre de threads dans le groupe. et l espace d indexation est 3d... plus simple pour travailler sur une image 2d ou une grille 3d...

Exécution parallèle des threads tous les threads fonctionnent en même temps : dans un ordre quelconque choisit par l ordonnanceur des processeurs graphiques, partager des résultats intermediaires? comment s assurer que les résultats sont disponibles? synchronisation! barrier() et groupmemorybarrier() déclarer une variable partagée par les thread du groupe : shared type variable;

Exemple # version 430 // core profile, compute shader layout ( binding = 0 ) // buffer 0: contient un tableau de position readonly buffer positiondata { vec3 positions []; }; layout ( binding = 1) // buffer 1: tableau de positions transformees writeonly buffer transformeddata { vec3 transformed []; }; shared vec3 edges [3]; layout ( local_size_x = 3 ) in; void main ( ) { int i= gl_globalinvocationid.x; int e= gl_localinvocationid.x; edges [e]= positions [i]; barrier (); // edges [0..3] contient les sommets d un triangle edges [e]= edges [(e+1) % 3] - edges [e]; barrier (); // edges [0..3] contient l arete (e, e+1) } transformed [i]= edges [e];

opérations atomiques : chaque thread ajoute 1 à une variable... quel est le bon résultat? problème? ajouter 1 à une variable : == 3 opérations, lire la valeur, ajouter 1, écrire la nouvelle valeur dans la variable...

solution : opérations atomiques, atomicadd(variable, 1), etc. autres opérations : atomiccompswap(), atomicexchange(), permettent de créer un type particulier de mutex, un spinlock. rappel du cours de système : les spinlocks et l attente active, c est le mal.

Exemple modifier plusieurs valeurs : nécessite plusieurs opérations, et il n existe pas d opérations atomiques pour ce cas... if( fragment_z < zbuffer ) { cbuffer = fragment_color zbuffer = fragment_z }

Exemple int lock ; while ( lock!= 0) {;} // attendre lock = 1; // bloquer : DOIT etre atomique avec le test // modifier les valeurs if( fragment_z < zbuffer ) { cbuffer = fragment_color zbuffer = fragment_z } lock = 0; // relacher

Exemple int lock ; while ( atomiccompswap (lock, 0, 1)!= 0) {;} // attendre // modifier les valeurs if( fragment_z < zbuffer ) { cbuffer = fragment_color zbuffer = fragment_z } atomicexchange (lock, 0); // relacher

Shader Storage Buffers buffers en entrée et en sortie : déclarés par le shader : layout( binding = x ) readonly buffer nom { }; layout( binding = x ) writeonly buffer nom { }; layout( binding = x ) indique l indice du buffer : glbindbufferbase(gl SHADER STORAGE BUFFER, x, buffer);

Shader Storage Buffers quel contenu? a priori un tableau de valeurs, éventuellement un tableau de structures, mais : le cpu et les gpu ont des orgranisations mémoire différentes : un vec3 est représenté par 3 floats sur cpu, aussi représenté par 3 floats sur gpu, mais aligné sur des multiples de 4... convertir les données pour les rendre accessibles au gpu.

Shader Storage Buffers alignement des données : cf opengl specification, section 7.6.2.2 Standard Uniform Block Layout 1. If the member is a scalar consuming N basic machine units, the base alignment is N, 2. If the member is a two- or four-component vector with components consuming N basic machine units, the base alignment is 2N or 4N, respectively. 3. If the member is a three-component vector with components consuming N basic machine units, the base alignment is 4N.

Shader Storage Buffers alignement des données : If the member is an array of scalars or vectors, the base alignment and array stride are set to match the base alignment of a single array element, according to rules (1), (2), and (3), and rounded up to the base alignment of a vec4. array may have padding at the end; the base offset of the member following the array is rounded up to the next multiple of the base alignment.

Shader Storage Buffers alignement des données : If the member is a structure, the base alignment of the structure is N, where N is the largest base alignment value of any of its members, and rounded up to the base alignment of a vec4. The individual members of this sub- structure are then assigned offsets by applying this set of rules recursively, where the base offset of the first member of the sub-structure is equal to the aligned offset of the structure. The structure may have padding at the end; the base offset of the member following the sub-structure is rounded up to the next multiple of the base alignment of the structure.

Shader Storage Buffer alignement des données : 2 types d alignement : std140 ou std430 std430 est réalisable en C/C++ sur cpu, avec attribute ((aligned (x))); ou gk::glsl::scalar, gk::glsl::vec2, vec3, vec4, mat2, mat3, mat4, etc. ou ne pas utiliser de matrices / vecteurs à 3 composantes...

Exemple # version 430 // core profile, compute shader struct triangle { vec3 p; vec3 edge1 ; vec3 edge2 ; }; layout ( std430, binding= 0 ) readonly buffer triangledata { triangle triangles []; };

Exemple # include "GL/ GLSLUniforms.h" struct Triangle { gk :: glsl :: vec3 p; gk :: glsl :: vec3 edge1, edge2 ; }; Triangle ( const gk :: Vec3 & a, const gk :: Vec3 & b, const gk :: Vec3 & c ) : p(a), edge1 (gk :: Point (b) - gk :: Point (a)), edge2 (gk :: Point (c) - gk :: Point (a)) {} std :: vector <Triangle > triangles ; for ( int i= 0; i < mesh ->trianglecount (); i++) { const gk :: Triangle & t= mesh ->triangle (i); triangles. push_back ( Triangle (t.a, t.b, t.c) ); } gk :: GLBuffer * input = gk :: createbuffer ( GL_SHADER_STORAGE_BUFFER, triangles );

Shader Storage Buffer vérifications? glgetprogramresource(), et les propriétés GL OFFSET, GL TYPE, GL TOP LEVEL ARRAY STRIDE. cf. l affichage de gkit après la compilation d un shader : program triangle. glsl... compute shader... uniform mvpvinvmatrix location 2, index 2, size 1, type mat4 buffer triangledata index 0 triangles [0]. color offset 48 type vec3,... top level stride 64 triangles [0]. edge1 offset 16 type vec3,... top level stride 64 triangles [0]. edge2 offset 32 type vec3,... top level stride 64 triangles [0]. p offset 0 type vec3,... top level stride 64 done.

Texture Images Textures en entrée et en sortie : textures en entrée : comme dans les autres shaders : uniform sampler2d texture; textures en sortie : uniform image2d image; pour l application : glactivetexture() + glbindtexture() pour les entrées, glbindimagetexture(index, texture,...) pour les sorties.

Texture Images mais : accès à un seul niveau de mipmap (cf glbindimage()), pas de filtrage, quelques contraintes de format : déclarer le type des canaux : int, float, etc. layout(rgba8), layout(rgba32f), et utiliser le bon type d image : image2d, iimage2d, uimage2d, etc.

Exemple # version 430 // fragment shader layout ( binding = 0, r32ui ) uniform uimage2d overdraw ; // uint32 in vec3 vertex_normal ; out vec4 fragment_color ; void main ( ) { imageatomicadd (overdraw, ivec2 ( gl_fragcoord.xy), 1u); } fragment_color = vec4 (abs ( vertex_normal ), 1.0) ; // application gk :: GLtexture * image = gk :: createtexture2d (gk :: UNIT0, w, h, gk :: TextureR32UI ); glbindtexture ( GL_TEXTURE_2D, 0); // utilisation glbindimagetexture (0, image ->name, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32UI );

Exemple # version 430 // compute shader layout ( binding = 0, rgba8 ) writeonly uniform image2d framebuffer ; layout ( local_size_x = 16, local_size_y = 16 ) in; void main ( ) { // rayon associe au pixel ( local.x, local.y) de la tuile vec4 oh= mvpvinvmatrix * vec4 ( gl_globalinvocationid.xy, -1, 1); vec4 eh= mvpvinvmatrix * vec4 ( gl_globalinvocationid.xy, 1, 1); struct ray r; r.o= oh.xyz / oh.w; r.d= eh.xyz / eh.w - oh.xyz / oh.w; // intersections avec les triangles float t; float h= 1.0; vec4 color ; for (int i= 0; i < triangles. length (); i ++) if( intersect ( triangles [i], r, h, t)) { h= t; color= vec4 ( triangles [i]. color, 1.0) ; } } imagestore ( framebuffer, ivec2 ( gl_globalinvocationid.xy), color );

Exemple // application gk :: GLTexture * output = gk :: createtexture2d (gk :: UNIT0, w, h, gk :: TextureRGBA ); glbindtexture ( GL_TEXTURE_2D, 0); // utilisation glbindimagetexture (0, output ->name, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA8 );