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

C++ Discussion :

Multiplication registres SSE


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2009
    Messages
    52
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Ao�t 2009
    Messages : 52
    Par d�faut Multiplication registres SSE
    Bonjour,

    Je suis en train de tester plusieurs instructions sse2, je me base sur la documentation MSDN (http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx).

    J'utilise VS2008 et mon programme est une application win32.

    J'essaie de multipli� un vecteur d'octet par un scalaire (un tableau de char par un int), j'ai d� faire d'autre manip auparavant (unpacke et package) dans le but de transform� mes octets(char) en short qui va me permettre de faire la multiplication (en fait je dois faire une addition avec un double que je transforme en short en le multipliant par 64).

    Bref, tout compile parfaitement et tout s'�x�cute sans bug, le probl�me est que lorsque j'essaie d'afficher les valeurs du tableau une fois le traitement fait et bien rien ne s'affiche (que du vide).

    J'ai test� sans la multiplication et les valeurs du tableau s'affiche, il y a donc un probl�me au niveau de ma multiplication.

    Voici mon code (je pense que cela sera beaucoup plus clair avec):

    le source:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    #include "test_sse.h"
     
    int main()
    {
    	int wait=0;
    	char test[16]={24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54};
     
    	for(int i=0;i<16;i++)
    	{
    		cout << test[i] << endl;
    	}
    	cout << "==========================" << endl;
     
    	CalculSSE(test,1,1.2);
     
     
    	for(int j=0;j<16;j++)
    	{
    		cout << test[j] << endl;
    	}
    	cin >> wait;
    	return 0;
    }
     
     
    char* CalculSSE(char* test,int brillance,double contraste)
    {
    		//cast de l'image et load
    		__m128i* pImg=(__m128i*)test;
    		__m128i PxH;
    		__m128i PxL;
    		PxH= _mm_loadu_si128(pImg);
    		PxL= _mm_loadu_si128(pImg);
     
    		//Initialisation constante
    		__m128i ZeroReg= _mm_setzero_si128();
    		__m128i BrillanceReg= _mm_set1_epi16((short)brillance);
    		__m128i ContrasteReg= _mm_set1_epi16((short)(contraste*64));
     
    		//UNPACK
    		PxH=_mm_unpackhi_epi8(PxH,ZeroReg);
    		PxL=_mm_unpacklo_epi8(PxL,ZeroReg);
    		//Multiplication brillance
    		PxH=_mm_mulhi_epu16(PxH,BrillanceReg);
    		PxL=_mm_mulhi_epu16(PxL,BrillanceReg);
     
    		PxH=_mm_packus_epi16(PxL,PxH);
     
     
    		_mm_storeu_si128(pImg,PxH);
     
    		test=(char*)pImg;
    		return test;
    }
    Le headeur:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>
    #include <opencv\cv.h>
    #include <opencv\highgui.h>
    #include <xmmintrin.h>
     
    using namespace cv;
    using namespace std;
     
    char* CalculSSE(char* test,int brillance,double contraste);
    en esp�rant que vous puissiez m'aider,

    P.S: Vous remarquerez que le but final et de faire un traitement d'image en passant par les registres SSE (qui est normalement cens� �tre plus rapide que le traitement standard).

    Cordialement,

    sushis

  2. #2
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par d�faut
    cout << char affiche le caractere non la valeur

    cout << (int)(test[i]) << endl;

    me parait mieux.

    Ensuite si tu veux des perfs, mieux vaut aligner ta memoire et utiliser load/store plutot que loadu/storeu.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2009
    Messages
    52
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Ao�t 2009
    Messages : 52
    Par d�faut
    Merci bien j'ai pas du tout pens� au cast...

    Bref, �a m'affiche que des z�ros, pourtant sans la multiplication les valeurs du tableau reste inchang� et dans l'ordre une fois la manip faite (unpack/pack).

    EDIT: l'utilisation de load et store fait plant� le programme!

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2009
    Messages
    52
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Ao�t 2009
    Messages : 52
    Par d�faut
    up!

    Je me suis en me relisant je me suis peut-�tre mal expliqu�.

    La valeur de la variable brillance vaut 1 dans mon test, normalement le tableau lors de son deuxi�me affichage (donc apr�s avoir effectu� les multiplication) est cens� affich� la m�me chose or �a n'est pas le cas il n'affiche que des z�ro...

  5. #5
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 45
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par d�faut
    Citation Envoy� par sushis Voir le message
    Bref, �a m'affiche que des z�ros, pourtant sans la multiplication les valeurs du tableau reste inchang� et dans l'ordre une fois la manip faite (unpack/pack).
    tes unpack sont faux alors ?

    Citation Envoy� par sushis Voir le message
    l'utilisation de load et store fait plant� le programme!
    oui, j'ai dis qu'il fallait aligner la memoire

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Ao�t 2009
    Messages
    52
    D�tails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Ao�t 2009
    Messages : 52
    Par d�faut
    Et bien je ne sais pas si met unpack sont faux.

    Tout fonctionne quand je n'utilise pas les instructions de multiplication.

    Je pensais que ma m�moire �tait align� "automatiquement" en utilisant cette
    fonction, je devrais faire �a d�s la d�claration de mon tableau?

    Je ne comprend pas tr�s bien...

    Enfin bref, on m'a dit d'utiliser les autre fonctions, le plus important pour moi et de faire fonctionner correctement la multiplication.

    Alors il aurait un probl�me au niveau des unpack?

  7. #7
    Membre Expert

    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    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� : D�veloppeur informatique
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par d�faut
    Citation Envoy� par sushis Voir le message
    Je pensais que ma m�moire �tait align� "automatiquement" en utilisant cette
    fonction, je devrais faire �a d�s la d�claration de mon tableau?
    Non - il faut utiliser des types sp�ciaux align�s (__m128, __m128i, __m128d, comme tu le fais) ou aligner de mani�re explicite un type utilisateur (avec __declspec(align(16)) : cf http://msdn.microsoft.com/en-us/library/83ythb65.aspx), ou allouer une zone m�moire align�e.

    Pour ce dernier point, il existe plusieurs techniques :
    • utiliser _aligned_malloc() (http://msdn.microsoft.com/en-us/library/8z34s9c6.aspx). malloc() et l'op�rateur new ne sont pas suffisant.
    • Utiliser p = new char[](taille + 16) (ou malloc), et incr�menter p de mani�re � ce que (p % 16) == 0 avant de l'utiliser. Ne pas oublier de garder quelque part l'adresse originale afin de pouvoir faire le delete correspondant.

    Un exemple :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    class aligned_buffer
    {
      char* m_buffer;
      char* m_aligned_buffer;
    public:
      aligned_buffer(std::size_t size)
        : m_buffer(new char[](size + 16)
      {
        m_aligned_buffer = m_buffer;
        m_aligned_buffer += (16 - (m_aligned_buffer % 16));
      }
      ~aligned_buffer()
      { delete m_buffer; }
      const char *ptr() const { return m_aligned_buffer; }
    };
    (Attention : ce n'est qu'on code d'exemple ; il n'est pas vraiment apte � passer dans votre code � vous, sauf si vous aimez les probl�mes).

    Un pointeur sur une variable du type __m128i ne r�f�rence pas syst�matiquement une zone m�moire align�e (le fait d'affecter une valeur � un pointeur ne va pas aligner la m�moire de mani�re magique : il faut que tu aligne la m�moire toi-m�me, o� que tu proc�des par loadu/storeu comme tu le fais � l'heure actuelle).
    [FAQ des forums][FAQ D�veloppement 2D, 3D et Jeux][Si vous ne savez pas ou vous en �tes...]
    Essayez d'�crire clairement (c'est � dire avec des mots fran�ais complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Caf�. C'est d�pass� tout �a.
    Et si vous �tes sages, vous aurez peut �tre vous aussi la chance de passer � la t�l�. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Ecriture registres multiples Modbus TCP
    Par Ashkandie dans le forum R�seau
    R�ponses: 2
    Dernier message: 01/08/2012, 11h50
  2. R�ponses: 0
    Dernier message: 19/10/2011, 14h05
  3. [SSE] Meilleur code pour "mirroir" (flip) d'un registre XMM
    Par BB_17 dans le forum x86 32-bits / 64-bits
    R�ponses: 3
    Dernier message: 28/05/2009, 12h19
  4. [Windows]acc�s base de registre windows
    Par Greg01 dans le forum API standards et tierces
    R�ponses: 27
    Dernier message: 05/06/2007, 15h14
  5. R�ponses: 6
    Dernier message: 25/03/2002, 21h11

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