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 :

SIMD SEE instructions


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Points : 23
    Points
    23
    Par défaut SIMD SEE instructions
    Bonjour à vous développeurs qui comme moi n'ont pas de vacances....
    J'aimerais optimiser mon raytracing..Pour cela je veux utiliser les intinsics SEE2
    de MSVC....Mais j'arrive pas à faire un vector<__m128>......J'ai toujours une erreur à l'exécution.....J'ai cherché partout sur internet mais rien de concret....
    Enfin maintenant je sais que cela doit toujours etre aligné sur 16 octets et qu'il faut utiliser _aligned_malloc(size,alignment)......mais ça ne me dit pas pkoi ça plante avec un vector<__m128>
    Donc si quelqu'un sait comment faire, j'attend devant mon écran loin des plages ensoleillées.....
    Merci

  2. #2
    screetch
    Invité(e)
    Par défaut
    un vector<__m128> n'offre aucune garantie quant à l'alignement (enfin je ment, ils offrent une garantie d'alignement spécifique a l'OS et l'implémentation qui est en général de 4 octets)

    les vector prennent en second argument de template un type Allocator qu'ils utilisent pour allouer la mémoire: tu pourrais créer ton type allocator pour allouer avec un alignement de 16.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Points : 23
    Points
    23
    Par défaut
    merci screetch...je vais essayer ça et je vous tiens au courant....

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Points : 23
    Points
    23
    Par défaut
    T'as raison screetch il faudrait implémenter une classe allocator....j'ai vu le modèle de l'allocator standard de la stl....... Mais vu tout le taf que j'ai...ça m'aidera beaucoup si quelqu'un l'a déjà fait et me file le code........
    Sinon je le coderai moi-meme dans 48 heures...
    Merci d'avance

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Points : 23
    Points
    23
    Par défaut
    Je me répond......J'ai trouvé un code tout fait qui marche de tonnerre....
    Donc pour ceux qui ont eu le meme pb que moi.... voilà la classe allocator version custom bien adapté au vector :<__m128, aligned_allocator<__m128> >

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    template <class T , int Alignment=16>
      class aligned_allocator 
      {
         public:
     
           typedef size_t    size_type;
           typedef ptrdiff_t difference_type;
           typedef T*        pointer;
           typedef const T*  const_pointer;
           typedef T&        reference;
           typedef const T&  const_reference;
           typedef T         value_type;
     
     
           template <class U>
           struct rebind
    	   {
               typedef aligned_allocator<U> other;
           };
     
     
           pointer address (reference value) const 
    	   {
               return &value;
           };
     
           const_pointer address (const_reference value) const 
    	   {
               return &value;
           };
     
     
           aligned_allocator() throw() 
    	   {
           };
     
    	   aligned_allocator(const aligned_allocator&) throw() 
    	   {
           };
     
    	   template <class U>
             aligned_allocator (const aligned_allocator<U>&) throw() 
    	   {
           };
     
           ~aligned_allocator() throw() 
    	   {
           };
     
          //max capacity
           size_type max_size () const throw() 
    	   {
    		   return 268435455;
           };
     
     
           pointer allocate (size_type num, const_pointer *hint = 0) 
    	   {
     
               return (pointer) _aligned_malloc( num*sizeof(T),Alignment);
           };
     
     
           void construct (pointer p, const T& value) 
    	   {
     
              // memcpy( p, &value, sizeof T );
    		   *p=value;
    		 //  new ( (void *) p ) T ( value );
           };
     
     
           void destroy (pointer p) 
    	   {
     
               p->~T();
           };
     
     
           void deallocate (pointer p, size_type num) 
    	   {
     
               _aligned_free( p );
           };
     };
    Voilà à bientot amis développeurs

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

Discussions similaires

  1. Optimiser une boucle à l'aide d'instructions simd
    Par moomba dans le forum Débuter
    Réponses: 5
    Dernier message: 10/11/2012, 19h31
  2. Instruction SIMD, véritable gain ou chimère
    Par beleys dans le forum C++
    Réponses: 9
    Dernier message: 20/07/2008, 21h04
  3. Instruction SIMD, classe F32vec4
    Par beleys dans le forum C++
    Réponses: 2
    Dernier message: 26/05/2008, 09h36
  4. [Crystal Report][VB6] instruction PrintReport
    Par yyyeeeaaahhh dans le forum SDK
    Réponses: 4
    Dernier message: 29/07/2002, 14h58
  5. [TASM] Problème concernant l'instruction LGDT
    Par Ninkosen dans le forum Assembleur
    Réponses: 3
    Dernier message: 15/07/2002, 19h09

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