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 :

[SSE] Meilleur code pour "mirroir" (flip) d'un registre XMM


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 7
    Par défaut [SSE] Meilleur code pour "mirroir" (flip) d'un registre XMM
    Bonjour

    Pour un traitement sur une image qui s'effectue ligne par ligne, il me faut le "mirroir" du bloc chargé dans le registre XMM, bloc représentant une suite de pixels codés sur 8 ou sur 16bits

    Par exemple, après avoir chargé en registre XMM0 les 16 premiers pixels de la ligne : [p0, p1, p2, ... , p15] j'aimerai disposer dans le le registre XMM1 de ces mêmes valeurs dans l'autre "sens" : [p15 ,p14, .... , p0]

    Idem pour des pixels qui serait codés sur des words, donc pour des registres XMM passer de [p0, p1, p2, ..., p7] à [p7, p6, ... , p0]

    C'est faisable avec des PSHUFLW, PSHUFHW, puis il faut l'instruction pour inverser des QWords, mais ce n'est plus du SSE2 (je crois ?). On peut aussi utiliser des shifts, des masques et des opérations logiques, mais j'ai l'impression de passer à coté de la solution la plus simple...

    Merci d'avance

  2. #2
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    Si c'est vraiment du travail sur une image réelle que tu veux faire, ce n'est pas SSE qui sera le plus performant (Benchmark garanti). Les GPU travaillant en // de ton CPU, tu pourras récupérer du temps pour autre chose.
    Regarde du côté de DirectX, ou, si vraiment tu n'aimes pas te compliquer la vie, la "nouvelle Seven" GDI avec l'usage du blitter. La GDI utilise ces instructions depuis belle-lurette (avant Gai-Luron cependant) et même sous 98 tu dois pouvoir faire une différence plus que très notable !
    La "nouvelle" GDI étant branchée au niveau architectural beaucoup plus bas qu'avant, dans la partie noyau.

    StretchBlt creates a mirror image of a bitmap if the signs of the nWidthSrc and nWidthDest parameters or if the nHeightSrc and nHeightDest parameters differ. If nWidthSrc and nWidthDest have different signs, the function creates a mirror image of the bitmap along the x-axis. If nHeightSrc and nHeightDest have different signs, the function creates a mirror image of the bitmap along the y-axis.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 7
    Par défaut
    Bonjour,

    Bon, le terme "d'image" était trompeur... DirectX, WDDM, GPU processing avec CUDA & Co, ce n'est pas une option pour moi (pour l'instant...)

    "L'image" en question est récupéré par une caméra linéaire et réside en mémoire, elle n'est pas mappé sur un BitMap, DIB & Co, elle n'est pas affichable en l'état (12 bits/pixel, demosaicing non fait). On est plutot sur du traitement de signal.

    J'aurais du donc parler de vecteur de données.
    Soit un vecteur de donnée dans un registre MMX, vecteur constitué de 8 valeurs de type WORD, noté [v0, v1, ... ,v7], quelle est la meilleur séquence pour obtenir le mirroir du vecteur [v7, ... , V0]

    Pour des WORD, il me semble difficile de trouver mieux que :

    PSHUFD xmm0, xmm0, 0x4E
    PSHUFLW xmm0, xmm0, 0x1B
    PSHUFHW xmm0, xmm0, 0x1B

    Pour un vecteur de 16 octets [v0, ... v15] a transformer en [v15, ... v0] je sèche...

  4. #4
    Membre expérimenté

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Par défaut
    N'aurais-tu pas intérêt à remapper tes datas au fur et à mesure de ton acquisition ?
    Le temps initialement perdu serait largement compensé par le µP graphique.

    La solution SSEx pose le problème du chargement et du déchargement qui est le plus coûteux ; un simple swap par demi-tables serait plus rapide et te permettrait de travailler sur n'importe quelles dimensions d'image et de résolution pixel byte/word/dword et même qword.
    Si tes canaux sont sur 4 bits tu peux-même passer en ARVB sans peine

Discussions similaires

  1. Réponses: 3
    Dernier message: 26/06/2008, 10h57

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