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 :

calcul de distance en sse3


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut calcul de distance en sse3
    Bonjour,

    dans mon programme, je calcule énormément de distance (euclidienne) entre 2 std::vector. Un collègue m'a dit qu'avec les instructions sse3 je pourrais aller bcp plus vite.

    Malheureusement je n'ai pas trouvé (sur le net) les lignes de code correspondant.

    Quelqu'un aurait-il des infos supplémentaires ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Points : 2 640
    Points
    2 640
    Par défaut
    Entre deux distances euclidienne de 2 std::vector ? C'est à dire ? Tu veux dire :

    sqrt ((vec1[0] - vec2[0])^2 + (vec1[1] - vec2[1])^2) + ... + (vec1[size] - vec2[size])^2) ?

    Ou tu considères des vecteurs de 3 éléments x-y-z ?

    Concernant SSE3, ces opérations peuvent être effectuées avec SSE2 je crois. Pour utiliser ces instructions, soit tu utilises l'assembleur (mais je ne te le conseille pas puisque tu dois jouer toi-même avec les registres SSE). Autrement, tu peux utiliser les intrinsics. Tu peux les considérer comme des fonctions inline qui offrent un niveau plus haut-niveau que l'assembleur. Pour utiliser ces fonctions il faut que tu inclus le fichier d'en-tête <xmmintrin.h>

    Tu as sur MSDN toutes les fonctions. Il faut savoir que, dans ton cas, je suppose que tu utilises des floats. Un registre SSE permet de contenir 16 octets (soit 4 float, 2 double...). Autre chose importante, il faut que tes données soient alignés sur 16 octets.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    __m128 vec1 = _mm_setr_ps (v1.x, v1.y, v1.z, v1.w);
    __m128 vec2 = _mm_setr_ps (v2.x, v2.y, v2.z, v2.w);
     
    // Cette ligne donne : (v2.x - v1.x, v2.y - v1.y ...)
    __m128 vec2MinusVec1 = _mm_min_ps (vec2, vec1);
     
    // Cette ligne donne : ((v2.x - v1.x) * (v2.x - v1.) ...
    __m128 mult2 = _mm_mul_ps (vec2MinusVec1, vec2MinusVec1);
     
    ... Soucis
    Ensuite, soucis. En effet il faut que tu ajoutes chaque élément afin d'en obtenir un scalaire, ce qui est une opération horizontale, ce à quoi ces instructions ne sont pas adaptées (bien que SSE3 intègre des instructions pour les opérations horizontales je crois). Alors soit tu extraits les données pour les additionner normalement sans utilisation ces instructions, ou alors tu réorganises tes données afin de les traiter plsu efficacement.

    Désolé pour cette réponse un peu décousue qui part dans tous les sens

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Salut, merci pour tes infos. Je vais continuer à creuser la question.

    Sinon j'utilise des doubles (et non des floats). Enfin, dans mon test, mes vecteurs sont dans R^4 mais demain je peut être dans R^2 ou dans R^10... Il me faut donc un truc générique...

Discussions similaires

  1. calculer la distance qu'il y a entre une div et le bas de page
    Par Henry9 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/09/2007, 00h33
  2. Problème et questions sur un calcul de distance
    Par ale2000 dans le forum Traitement d'images
    Réponses: 7
    Dernier message: 11/09/2007, 20h33
  3. Calculer des distances géodésiques
    Par ToTo13 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 30/11/2006, 08h59
  4. Calcul de distance entre deux points en WGS84
    Par marieR dans le forum Langage
    Réponses: 5
    Dernier message: 03/08/2006, 17h07
  5. [GEOMETRIE] calcul de distance dans un triangle
    Par gronaze dans le forum Mathématiques
    Réponses: 10
    Dernier message: 29/06/2006, 10h04

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