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

x86 32-bits / 64-bits Assembleur Discussion :

Comment utiliser des instructions SSE2 dans un code c++?


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Comment utiliser des instructions SSE2 dans un code c++?
    Bonjour, à tous, je code en C++ mais j'ai une partie de code
    qui pourrait être optimisée, je voudrais utiliser les instructions SSE2

    je veux filtrer une image ligne par ligne, mais à chaque fois la même chose pour chaque ligne, voici le code :

    Les données traitées (outputFrame et inputFrame) sont au format double, mais il me semble qu'avec les SSE2, on pourrait filtrer 4 lignes par 4 lignes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    for (int IDrow=_NBrows; IDrow ; )
    {
    value=0;
    --IDrow;
     
    for (int IDcolumn=0; IDcolumn<_NBcolumns ; ++IDcolumn)
    {
    value = outputFrame[IDrow][IDcolumn]*_filteringCoeficientsTable[2] + inputFrame[IDrow][IDcolumn] + _filteringCoeficientsTable[0]* value;
    outputFrame[IDrow][IDcolumn] = value;
    }
    }
    Si vous avez des informations, bouts de code, #include à mettre pour les intrisc trucs, je suis preneur

    merci à vous

  2. #2
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Une petite erreur stratégique toutefois.

    Je prends un exemple connu : Faire de la copie d'écran avec du MMX en se disant que ça va foncer... Ben non (même si les performances sont apparemment supérieures du point de vu CPU, ce n'est pas la bonne solution). Si tu utilises une commande de type Bitblt, tu demandes à la carte de faire directement le boulot, et aucune méthode n'ira plus vite que ne pas le faire (citation connue maintenant ). Il existe plusieurs moyens de faire du traitement d'image à la volée sans passer pas l'ASM (bien que ce soit la plus puissante mais vu que tu veux l'inclure dans du C++ autant ne pas te prendre la tête). Utilise les COM (DirectShow par exemple. Le fait de déporter le travail dans le hard sera n'importe comment toujours plus rapide que toute bidouille dans le CPU. Simplement et en raccourci : Les nouveaux OS ne sont plus construits autour du CPU mais du "hard" en général . Je te conseille donc de revoir la stratégie globale de ton application si tu désire tomber de la performance (chacun sont boulot: IHM, traitement des flux, analyse…)

    @+WO

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    oui, mais dans le cas de ce code là, je suis obligé d'effectuer cet algorithme, c'est un filtre passe bas orienté par colonne ou par ligne suivant ce que je veux faire.

    donc, je dois prendre par exemple une ligne et réaliser l'opération suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (indicecolonne=0;indicecolonne<max; ++indicecolonne)
    {
    value=value*coef+pixel(i);
    pixel(i)=value
    }
    donc, ca irait plus vite si je fais, prend 4 lignes, fais la même opération pour les 4 et ainsi de suite


    quelqu'un a une idée?

  4. #4
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Bien, ce genre d'intégrateur est déjà dans le code (DSP) VSP des cartes, pourquoi t'enquiquiner à ré-inventer la roue (si c'est le plaisir, je ne peux que t'encourager... sinon...). Le plus intéressant c'est de réorganiser le chaînage des divers éléments DSP pour ton application. Tu as même des objets qui te permettent de visualiser une acquisition, de la traiter et de l'enregistrer sur le disque sans faire appel à la RAM et au CPU...

    Donc, SDK rubrique DirectShow...

    Bien sûr, si ton OS date d'avant 98SE ou si tu utilises une carte graphique qui n'est pas WDM (aujourd'hui ça paraît difficile...) tu ne jouiras pas de l'ensemble de tous ces mécanismes...

    Si par contre tu utilises une (ou deux !) carte(s) PCI ExpressX16 tu risques de tomber de ta chaise devant les résultats et les perfs...

    Le but de ma recommandation, c'est de ne pas te retrouvé piégé par ton propre code et de te mordre les doigts dans 4 mois... : Maintenant c'est comme vouvoul...

    @+WO

    PS: Tu oublies aussi que tu n'iras pas 4 fois plus vite.. même au niveau théorique... le SSE ne va pas gérer tes variables buffer (intégration) gratuitement...

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    bonjour,

    je suis très intéressé par ta remarque, pour le plaisir maso de tout refaire en c++, oui, j'aime bien, mais juste par jeux, mais au final si c'est déjà implémenté dans les cartes graphiques, je prends!!!

    pour mon appli, je voudrais que ca tourbede préférence sous liux et windows, donc des trucs portables de préférence.

    tu dis que c'est déjà implémenté dans les dsp, mais est il possible de lancer les calculs en type double?

    as tu des liens/info sur lesquels moi et le sintéressés pourraient apprendre?
    ++
    Alex

  6. #6
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Un dsv/vsp ça travaille bien en v flottante ne t'en fais pas... si tu rencontres un problème ce n'est pas là...

    Si tu veux travailler sous des OS différents quel est le problème à ton avis...

    le matériel ? Non

    l'Os ? Non

    le format d'échange entre l(OS bas niveau) et le hard ? Oui

    Donc, la technologie objet bas niveau et le format de driver WDM (qui est celui des cartes actuelles indépendament des OS) répondent parfaitement à ton cahier des charges. Vitesse, portabilité.

    MSDN et COM http://www.japheth.de et tout le DDK et DirectShow dans le SDK et... tu as combien de temps devant toi ?

    @+WO

  7. #7
    Membre averti Avatar de Flo.
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2002
    Messages : 379
    Points : 404
    Points
    404
    Par défaut
    Salut,

    Il faudrait que tu précises quel compilateur tu utilises. Les syntaxes sont différentes selon le compilateur que t'utilises.

    Il faut également connaître les types (byte, word, etc) et extrémas de ton calcul (min / max). Cela te permettra de savoir comment utiliser les registres.

    Si c'est du calcul flottant, quelle est la précision ? Peux-tu te ramener à plus simple.

    Effectivement comme le dit WO, si tu peux faire sans c'est mieux. Si ton code doit etre portable, c'est dommage, et bienvenu dans le monde du MMX / XMMX.

    Les jeux d'instruction SSE, SSE2 et SSE3, sont des petites merveilles qui ont révolutionné le traitement du signal. Je fais du traitement d'images à longueur de journée ... un collègue m'a enseigné leur utilisation et depuis c'est une révolution.

    A mon avis, il y a des tâches qu'il ne faut pas confier à d'autres. Programmer soi-même un algo et en optimiser le code fait parti du métier de traitement d'images. Je ne me considère pas du tout comme un informaticien, c'est pas mon job ... Par contre je ne confierai jamais la programmation d'un de mes algos à quelqu'un d'autre (cf. dll, lib & co).

    J'ai vu trop d'ingénieurs en TI utiliser des sherlock, mil ou aphelion ... et pleurer quand ils ne trouvaient pas leur bonheur. J'ai même connu un ingénieur, excellent en vision industrielle, et qui faisait tout avec Sherlock sans jamais toucher du code.

    A mon avis c'est possible si tu peux maitriser avec succés tes images ... mais le jour ou t'as pas le choix ... aye aye aye !!!

    Je m'égare-là ... Donne-nousi plus de précision sur ton calcul, c'est pas suffisant.

    A+.

    Flo.

    PS (1ere edition) : les registres MMX / XMMX te permettent de paralléliser des calculs mais pas sur des lignes ... sur les élements des ces lignes. Par exemple, pour faire un seuillage d'une image en xmmx, on va traiter 16 pixels en même temps. On seuillera de 16 pixels en 16 pixels. Dans ton cas, selon les extremas de ton calcul, en XMMX, ça devrait-etre en 8 par 8 ou 4 par 4.

    PS (2eme edition) : il serait préférable de stocker ton image dans un tableau à une dimension ....

  8. #8
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Je souscris à tout ton propos !

    @+WO

    PS: Si ce n'est que n'importe quel calcul repoussé dans carte graphique ira toujours plus vite que n'importe quelle astuce au niveau CPU -> Ce qui va plus vite, c'est de ne pas le faire

Discussions similaires

  1. Comment utiliser des images SVG dans Delphi
    Par PiPo123 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 25/09/2008, 07h08
  2. Réponses: 2
    Dernier message: 03/12/2007, 18h46
  3. Réponses: 3
    Dernier message: 18/09/2007, 15h54
  4. Comment utiliser des dll C++ dans un projet C# ?
    Par kreitech dans le forum C#
    Réponses: 5
    Dernier message: 20/02/2007, 17h49
  5. Réponses: 6
    Dernier message: 22/05/2006, 14h54

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