OpenGL et WebGL, comparaison de performances dans le framework Geant4 Laurent Garnier LAL / IN2P3 / CNRS JI 2014– Le Grau du Roi – 15 Octobre 2014 Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
Sommaire 1. Introduction OpenGL / WebGL 2. Problèmes rencontrés 3. Performances 4. Bilan et améliorations possibles Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
1.1 OpenGL, WebGL But : Cible : Objectifs d’une application Web Framework de simulation Geant4 ~400 000 lignes de code (essentiellement C++) ~ 80 développeurs dans le monde Utilisé dans les domaines : Physique des hautes énergies / Biomédical / Spacial Objectifs d’une application Web Tutoriels, cours, exemples en ligne, accessibilité à distance… Application OpenGL Application Web WebGL Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
1.2 Ou est le problème ? Coté « application » : Coté graphique : Aucun (enfin presque…) Coté graphique : Passage du graphique « natif » OpenGL => graphique « orienté web » WebGL Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
1.3 OpenGL et WebGL ? Introduction dans Geant4 OpenGL2.0 OpenGL3.0 OpenGL 4.2 1992 1996 2004 2008 2010 OpenGL: Librairie multiplateforme permettant de faire des application graphiques, principalement orientés 3D WebGL: Basée sur OpenGL2.x et Javascript, permet de faire des applications graphiques dans les browsers Web récents. Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
2.1 Quels sont les difficultés ? WebGL est basé sur OpenGL2.x, or dans Geant4, la version de OpenGL utilisée est principalement OpenGL1.x Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
2.2 OpenGL1.x / OpenGL2.x G4 CPU GPU G4 CPU GPU G4 CPU GPU Mode “Immediate” – OpenGL1.x La géométrie est donnée vertex par vertex A chaque vertex décrit, une commande est envoyée au GPU Crée un gros traffic entre le CPU et le GPU Supprimé depuis OpenGL 3.1 Mode “Stored” – OpenGL1.x Stocke les vertex et attributs dans une “Display List” Envoie la “Display List” au GPU Meilleur que le mode “Immediate”, mais à chaque changement on doit reconstruire une “Display List” Stockage sur le GPU – OpenGL2.x Passage par des “Vertex buffer objects” En résumé, on construit nous même nos tableaux de vertex et attributs et on les envoie au GPU On accède « directement »sur le GPU à ces tableaux par la suite G4 CPU GPU G4 CPU GPU Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
2.3Architecture de Geant4 Geant4 possède une architecture Modèle / Vue /Controleur bien séparé Kernel de Geant4 interface Drivers Graphique G4PhysicsLists WebGL OpenGL G4Event G4interfaces G4Geometry RayTracer G4Processes HepRep Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
2.4 OpenGL1.x dans Geant4 Appel à des fonctions OpenGL1.x dispersés Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
2.5 Migration En 2 temps : Migration des anciennes commandes vers l’utilisation de Vertex Buffer Object (VBO), le tout en gardant en place l’existant Pas si simple… Définition d’un nouveau driver utilisant WebGL et basé sur les VBO Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
2.6 Exemple Exemple pour la fonction glOrtho : Fragment shader VBO GPU Fragment shader glOrtho Redefinition de cette fonction VBO #define glOrtho fVboDrawer->vboGlOrtho Appel de notre fonction void G4OpenGLVboDrawer::vboGlOrtho(GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar) { if (fVboViewer) { if (fVboViewer->isInitialized()) { float a = 2.0f / (right - left); float b = 2.0f / (top - bottom); float c = -2.0f / (zFar – zNear); float tx = - (right + left)/(right - left); float ty = - (top + bottom)/(top - bottom); float tz = - (zFar + zNear)/(zFar - zNear); float ortho[16] = { a, 0, 0, 0, 0, b, 0, 0, 0, 0, c, 0, tx, ty, tz, 1 }; glUniformMatrix4fv(fVboViewer->getShaderProjectionMatrix(), 1, 0, ortho); } else { G4cerr << "glFrustum could only be used in GL_PROJECTION mode" << G4endl; } } } } Vertex shader void main(void) { gl_Position = uPMatrix * uCMatrix * uMVMatrix * uTMatrix * vec4(aVertexPosition, 1.0) … Have to change projection matrix Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
2.7 Functions à remplacer Certaines fonctions sont “deprecated” dans OpenGL 3 (Release Date: August 11, 2008) …Et seront abandonnées en OpenGL 4 (Release Date: March 11, 2010) Mais heureusement, il y existe un « compatibility mode » pour ces fonctions ! Deprecated Function : glBegin(...) glEnd() glCallList(...) glColor* glMaterial* glVertexPointer Et tout ce qui se trouve entre glBegin et glEnd: glVertex* / glNormal* / glTexCoord* / ….. Toutes les opérations de matrices: glRotate*, glTranslate*, glScale*, glMatrixMode(), glLoadIdentity(), glPushMatrix()…
3.1 Performances (sans graphique) App App Qt Wt Mac /Linux / … Mac /Linux / … Hardware Hardware Sans le graphique, entre l’utilisation du framework Wt et Qt On change uniquement la couche « interface » entre l’application et l’utilisateur pour une interface Web => Performances identiques Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
3.2 Performances (avec graphique) App App App Qt Qt Wt OpenGL1.x OpenGL2.X WebGL Hardware Hardware Hardware On ajoute le graphique : Changement de l’« interface » entre l’application et l’utilisateur pour une interface Web Passage de OpenGL1.x aux Vertex Buffer Object, puis à WebGL Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
3.2 Performances (avec graphique) Passage de OpenGL1.x aux Vertex Buffer Object => Gain théorique assez faible, variable en fonction des applications => Dans la pratique, on est 2 fois plus lent Passage des Vertex Buffer Object à WebGL => 5 fois plus lent Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
4 Bilan et améliorations Pourquoi est-ce plus lent ? OpenGL1.X / VBO Actuellement on construit des milliers de VBO sur le GPU => Dégradation des performances (par 2 actuellement) G4 CPU GPU G4 CPU GPU 16 16 Version actuelle Version optimizée Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
4 Bilan et améliorations Pourquoi est-ce plus lent ? OpenGL2.X / WebGL WebGL est basée sur du Javascript ce qui rajoute une surcouche et ralenti l’application. Dégradation des performances (par 5 actuellement) App App App Wt Qt Wt Javascript OpenGL2.X WebGL OpenGL2.X Hardware Hardware Hardware Graphic « natif » Graphic Web Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
References Site web Geant4 : http://geant4.cern.ch/ OpenGL : http://opengl.org/ WebGL : http://fr.wikipedia.org/wiki/WebGL Framework Wt : http://www.webtoolkit.eu/wt OpenGL Vertex Buffer Objects tutorial: http://nehe.gamedev.net/tutorial/vertex_buffer_objects/2 2002/ Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa
Questions ? Laurent Garnier - LAL / Geant4 Workshop - 30 Sept 2014 - Okinawa