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

DirectX Discussion :

accès direct mémoire vidéo ?


Sujet :

DirectX

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 467
    Points : 681
    Points
    681
    Par défaut accès direct mémoire vidéo ?
    bonjour

    J'aimerai savoir si quelqu'un connait une méthode pour accéder à la mémoire vidéo ?

    Je m'explique : pour un usage bien particulié j'ai besoin de comparer des milliers de scènes 3D entre elles.

    Pour cela par exemple je peux 'noter' une scène en calculant le nombre de pixels rouge que comprend le rendu.

    Ainsi l'algo est du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    best_note = 0;
    best_index = -1;
    for(int i=0; i<1000; ++i)
    {
      surface.Rendu(scene[i]);
      note = Calcul_note(surface);
      {best_note, best_index} = Best([best_note, best_index}, {note, i});
    }
    Rien de bien compliquer en soi et j'arrive même à l'implanter.

    Seulement voila... techniquement parlant il me semble faire une chose complètement absurde . Car la seul façon que je connaisse pour implémenter mon 'calcul de note' est de passer par 'Surface.LockRectangle' qui permet d'avoir un accès aux pixels du rendu.

    C'est absurde car j'utilise ma belle carte graphique 3D avec tous pleins de shaders pour calculer le rendu et ... je ne le fais pas pour calculer la note ! Obligé de passer par le processeur x86 pour un rendu graphique

    N'y a t-il pas moyen de rester dans la carte graphique pour faire des calculs sur une surface graphique ? bien sur à la fin faudra bien réinjecter le résultat quand même.

    Voila, il est évident que si tel était le cas je gagnerai en efficacité et en rapidité car j'éviterai beaucoup de copies mémoire inutiles

    Pourquoi n'existe-t-il pas un moyen de lancer une procédure sur la carte graphique ? On peut bien en faire au niveau de chaque pixel alors pourquoi ne pas pouvoir en lancer une comme ça indépendamment ?

    Qu'en pensez vous ?

  2. #2
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut,
    dans un shader il est possible en utilisant le blending additif de rendre 800x600 fois sur le même pixel tout en parcourant les 800x600 pixels d'une texture, ansi tu peux compter le nombre de pixel rouge, la moyenne des pixels rouges etc...
    mais attention en gros tu ne peux pas faire de boucles en tant que tel, tu peux faire N fois le même calcul mais en parallèle, pas en séquentiel

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 467
    Points : 681
    Points
    681
    Par défaut
    Donc pour implémenter avec le GPU mon calcul de note sur une surface de rendu :

    1) Je fais en sorte que ma surface de rendu principale soit aussi une texture
    2) Je crée une autre surface de rendu de dimension 1x1 pixel
    3) Je fais sur cette dernière un rendu avec un shader permettant le calcul de 'note' avec ma texture/surface.
    4) Je recupère ma note sur le pixel unique de la surface 1x1 pixel

    Ca devrait marcher mais c'est quand même vachement tordu

    Techniquement parlant rien ne devrait empêcher de lancer une unique procedure sur le GPU !?

    Par exemple dans des quakes-like récents où les scènes sont très réalistes. La luminosité génerale du rendu est adaptée en fonction de la luminosité réelle de la scène (face au soleil, dans un grotte, etc...)

    Ce calcul d'adaptation n'a rien de compliqué : nombre des pixels du rendu divisé par la somme de ces pixels. Seulement je trouverai étrange qu'il soit fait avec le CPU ou bien avec la méthode expliquée au dessus pour le GPU !?

    Connaissez vous la méthode employée dans Direct3D pour effectuer ce calcul (qui est loin d'être anecdotique) ?

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 361
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 361
    Points : 20 381
    Points
    20 381
    Par défaut
    ijk-ref en programmant avec HLSL cela ne donne pas satisfaction ?

    Par exemple dans des quakes-like récents où les scènes sont très réalistes. La luminosité génerale du rendu est adaptée en fonction de la luminosité réelle de la scène (face au soleil, dans un grotte, etc...)

    Ce calcul d'adaptation n'a rien de compliqué : nombre des pixels du rendu divisé par la somme de ces pixels. Seulement je trouverai étrange qu'il soit fait avec le CPU ou bien avec la méthode expliquée au dessus pour le GPU !?
    eh au risque de dire des aneries la carte graphique ne fait pas cela ; elle calcule bêtement des transformations de polygones, des calculs matriciels, affichage et projection en 3d et selon un éclairage donné.
    Je crois que des GPU intègrent aussi des calculs genre FFT utilisés pour la décompression jpeg et les filtres ( flou,etc..)
    Peut-être devrait-tu te pencher sur une programmation plus spécifique et consulter les docs de nVidia par exemple mais ce n'est que spéculation

    Citation Envoyé par ijk-ref Voir le message
    N'y a t-il pas moyen de rester dans la carte graphique pour faire des calculs sur une surface graphique ? bien sur à la fin faudra bien réinjecter le résultat quand même.
    euhh non la carte graphique ne fait pas cela ; peut-être que dans le futur il ya fort à parier que les cartes fassent cela...elles seront plus intelligentes...
    Pour faire des calculs, ils faut que les GPU soient apparentés à des CPU avec mémoire cache pour le pipeline de données ( comme pour un processeur Intel ) des registres EAX,ECX..une UAL....
    Ceci dit la question est intéressante

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 467
    Points : 681
    Points
    681
    Par défaut
    Citation Envoyé par Mat.M Voir le message
    ijk-ref en programmant avec HLSL cela ne donne pas satisfaction ?
    Mais le HLSL me satisfait complètement... sauf que je n'ai pas le droit de l'utiliser où bon me semble !

    Quand je veux appliquer un calcul à chaque pixel : OK
    Quand je veux appliquer un calcul à chaque vertex : OK

    Quand je veux faire un calcul 'tout court' : NAN !

    Toi qui habites le Canada (GPU) et moi la France (CPU) : Si je te demande le poids de ta voiture. Vas tu m'envoyer ta voiture pour que je puisse le mesurer moi même ? Ou bien vas-tu le mesurer toi même pour me transmettre juste le poids ?


    Je ne devrait pas à avoir à 'consulter les docs de nVidia' car je ne demande rien de compliqué à faire pour le GPU. C'est juste que je ne trouve rien dans Direct3D qui permet de le faire logiquement.

    Edit : et puis les GPU sont déjà apparentés à des CPU. le GPU peut déjà faire le calcul que je demande. Mais il a tendance à le faire en parallèle alors que je demande seulement de faire qu'une fois - normalement qui peut le moins peut le plus.

  6. #6
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut tu as l'air d'oublier le principe de base des gpu:
    calculs parallèles (et non séquentiels!) sur des sommets ou des pixels (ou des triangles)

    je ne vois pas bien ce que la technique que je t'ai donné a de tordue, si tu voulais parallèliser l'algo sur un (plusieurs) cpu tu ferais bel et bien comme cela!

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 467
    Points : 681
    Points
    681
    Par défaut
    J'avoue c'est quoi un Gipihou ?

    Cependant (sans jouer sur les mots) pour moi un GPU fait seulement du séquentiel et plus précisèment du calculs vectoriels (plusieurs opérations identiques lancer en même temps) comme le MMX. Donc peut de chose à voir avec le parallélisme. C'est plutôt comme ça que je vois les choses. Faut dire que mes notions sont plutôt vagues. Alors faut pas hésiter à me contredire

    Je comprends bien que le GPU a été principalement fait pour des calculs sur les pixels et des vertices. Mais il est aussi utilisé pour calculer une FFT. D'ailleurs je viens de regarder l'exemple fournit dans le SDK de DirectX et j'ai rien compris ! Pourtant je connais bien le principe de la FFT et du pixel-shader ... mais là les 2 en même temps... rien compris

    Donc acx01b il ne faut pas t'énoner de ma remarque sur ton conseil C'est juste mon cerveau qui ne voit sûrement pas droit.

    Ainsi si tu voulais bien être plus clair - s't'plait - Pourrais tu m'expliquer comment tu obtiendrais le "nombre de pixels rouges" sur une surface direct3D avec le GPU ?

    note : on n'a qu'à dire qu'un pixel "est rouge" quand "si et seulement si "sa composante rouge est supérieure à 0.5"

  8. #8
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Salut.

    Juste comme ça, tu connais CUDA ?

    C'est pour Nvidia et à partir des geforces 8, mais tu as à ta disposition de 8 à 128 processeurs graphiques (selon modèle) qui permettent des calculs parallélisés. Du genre tu découpes ta texture en 128 carrés, et tu fais faire le calcul par les GPU. Les registres, la mémoire, etc... sont à disposition.

    Ce n'est pas forcément adapté à ta situation, mais c'est bien de savoir vers où se dirige le développement sur GPU. Pour l'instant, c'est nouveau, pas encore top (plutôt adapté vertex/directx et texture/opengl).

    C'est plutôt révolutionnaire, je trouve. Sûrement qu'à l'avenir, ils sera possible de faire un peu comme on a envie sur les GPU.

    PS: il existe la même chose chez ATI (pour l'instant plutôt orienté assembleur).

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    467
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 467
    Points : 681
    Points
    681
    Par défaut
    Voui je connais CUDA... de nom car j'ai une ATI. Et puis j'ai pas trop envi de me plonger dans les spécifications propres à chaque carte graphique.
    Suivre les Shaders 'universelles" version 2, 3, ou 4 avec "M$ HLSL" sont largement suffisants pour toutes mes divagations intellectuelles

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/03/2010, 08h17
  2. Accès mémoire vidéo sous XP
    Par - Robby - dans le forum Assembleur
    Réponses: 2
    Dernier message: 20/04/2008, 08h48
  3. Accès séquentiel/Accès direct etc... kesako ?
    Par da_cruz dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 10/09/2003, 11h22
  4. Accès direct au disque dur
    Par Berdo dans le forum x86 16-bits
    Réponses: 4
    Dernier message: 12/01/2003, 16h21
  5. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20

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