IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

[FAQ] [3D] Comment exploiter le parallelisme entre CPU et GPU ?


Sujet :

Contribuez

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut [FAQ] [3D] Comment exploiter le parallelisme entre CPU et GPU ?
    Comment exploiter le parallelisme entre CPU et GPU ?

    Une application 3D temps réel exploite toujours le processeur central (CPU) et la carte graphique (GPU) intensivement, et de manière alternée. Etant deux ressources séparées physiquement, on peut donc clairement les faire travailler en parallèle et gagner en performances. Cependant, mettre en place ce parallelisme et l'exploiter de manière optimale n'est pas toujours évident.

    Ce qui rend possible la parallélisation entre la CPU et la GPU, est le fait que les envois de triangles à la carte graphique (DrawPrimitive pour DirectX, glDrawArrays avec OpenGL par exemple) rendent la main au programme immédiatement, sans attendre que ceux-ci soient traités et affichés à l'écran. Ainsi une stratégie évidente pour paralleliser l'exécution, et de placer les traitements lourds pour la CPU juste après l'envoi de triangles à la GPU.

    Mais ce n'est pas suffisant. Pour être efficace, il faut tenter d'envoyer le plus de triangles avec le moins d'appels possibles (voir "Qu'est-ce que le batching ?"). Ainsi la GPU sera occupée plus longtemps sans nécessiter d'interventions de la CPU, et cette dernière aura plus de temps devant elle. Si vous envoyez les triangles à la GPU par groupes de 100, visiblement vous ne pourrez rien paralléliser, la CPU passant plus de temps dans les appels drivers que la GPU dans le traitement des triangles.

    Un autre point clef de la parallélisation, est le pipeline d'exécution de la GPU. En gros, la carte graphique est programmée pour exécuter certaines actions dans un certain ordre, et tant que ceci est respecté alors vous en tirerez les meilleurs performances (voir notamment "Comment est organisé le pipeline 3D ?"). Si par contre vous tentez d'interrompre cette organisation par un appel inapproprié, vous risquez de casser le flot des instructions et de resynchroniser CPU et GPU ; vous perdez donc instantanément tout parallélisme. Plus concrètement, si vous tentez par exemple de récupérer le contenu du back-buffer, la carte graphique sera obligée de stopper ce qu'elle était en train de faire (on parle de flush du pipeline), et de se resynchroniser avec la CPU pour lui transmettre les données souhaitées. Ainsi si vous souhaitez effectuer ce genre d'appels, faites le de préférence lorsque vous êtes certain que la GPU ne fait rien, par exemple entre l'affichage à l'écran et le début du rendu.

    Pour résumer, voici un schéma d'un programme exploitant très mal la parallelisation :

    Ici on voit bien que beaucoup de temps est gaspillé : lorsque la CPU travaille la GPU ne fait rien, et vice-versa.

    Et en voici un qui exploite au mieux celle-ci :

    Ici les deux processeurs tournent en même temps, permettant de diviser énormément le temps d'exécution d'une frame.

    Ceci est bien sûr une caricature, dans un moteur complexe on aura plusieurs envois de batchs alternés, l'important étant de toujours placer une utilisation de la CPU pendant que la GPU les traite. Si on a un rendu multi-passes, on peut par exemple calculer une passe pendant que la GPU rend la passe précédente, plutôt que de tout calculer en bloc avant le rendu.

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut


    Juste :

    CPU juste après l'envoi de triangles à la CPU.
    Devrait être :

    CPU juste après l'envoi de triangles à la GPU.
    non?
    Jc

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oups oui, effectivement.

    J'ai corrigé, merci

  4. #4
    Rédacteur

    Avatar de loka
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2004
    Messages
    2 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 672
    Par défaut
    Plus je lis, plus je me dis que j'ai encore beaucoup de chemin à faire... faut donc que je lise plus


+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/11/2010, 10h27
  2. [CSS] [FAQ] Comment mettre une bordure entre chaque lignes d'un tableau
    Par tzilliox dans le forum Contribuez
    Réponses: 0
    Dernier message: 12/10/2009, 11h37
  3. Réponses: 7
    Dernier message: 10/03/2008, 09h29
  4. Réponses: 3
    Dernier message: 04/02/2004, 18h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo