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 de deux vecteur en SIMD


Sujet :

C

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 80
    Points : 41
    Points
    41
    Par défaut multiplication de deux vecteur en SIMD
    Bonjour tous le monde;
    j'ai déja programmer en c, maintenant je fait un peut de SIMD (single instruction multiple data), et je suis débutant donc mon probléme est que je veut faire la multiplication de deux vecteur en utilisant des instruction SIMD mon premier vecteur est X1 = 1 2 3 4 et mon deuxieme vecteur est X2 = 1 5 6 7 le résultat de la multiplication de ses deux vecteurs est f = 1 10 18 28 en sachant que c'est des float32. j'ai trouver un code sur internet qui marche le probléme je comprend pas comment sa marche en sachant que c'est une partie du code seulement c'est a dire que les valeurs de X1 et X2 sont déclarer plus haut. voici le code
    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
     
    vfloat32 dot_vf32vector(vfloat32 *vX1, vfloat32 *vX2, int n)
     
    {
        vfloat32 x11, x21, z, f; 
     
        for(int i=0; i< n; i++) {
            x11 = _mm_load_ps((float32*) &vX1[i]);
            x21 = _mm_load_ps((float32*) &vX2[i]);
    	z = _mm_mul_ps(x11, x21);
    	f = _mm_add_ps(f,z);
     
           }
    return f;
    }
    moi se que j'ai compris c'est que pour i=0 avec l'instruction _mm_load_ps on charge la premiere valeur de X1 (float32) dans X11 (registre de 32bit) et de meme pour X21, aprés avec l'opérateur _mm_mul_ps je multiplie x11 et x21 se qui me donne normalement la valeur 1 (float 32) dans f qui est un registre de 32bit. aprés on passe a i=1 et on répete la meme opération mon probléme c'est quand on arrive a l'étape d'addition on aura la valeur contenue dans f précedement donc 1 et le nouveau contenue dans z qui est normalement 10 et donc en f on a 11 se qui veut dire que je me trompe dans mon raisonement. merci de bien vouloir m'éclairer svp

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Points : 608
    Points
    608
    Par défaut
    Je ne connais pas le type vfloat32, tu as trouvé ce code où ? A moins que ce ne sois un typedef pour __m128. Même dans ce cas ce que le code fait n'est pas clair. En gros la somme des produits des éléments du tableau. Mais fait de manière partielle puisqu'est retourné un vecteur de 4 éléments.

    Bref ça n'a de sens que si vfloat32 est un __m128 et n=1.

    Je pense que le code devrait ressembler à ça :

    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
     
    #include <xmmintrin.h>
    #include <stdio.h>
     
    /* c=a*b, element wise */
    void dot_vector(float *a, float *b, float *c, int n) 
    {
        __m128 va, vb, vc; 
        int i;
     
        for(i=0; i+4 < n; i+=4) {
            va = _mm_load_ps(&a[i]);
            vb = _mm_load_ps(&b[i]);
    	vc = _mm_mul_ps(va, vb);
            _mm_store_ps(&c[i],vc); 
         }
        for(; i < n; i+=1) {
            c[i]=a[i]*b[i];
        }
    }
     
     
    int main() {
      float a[5] = { 0, 1, 2, 3, 4} ;
      float b[5] = { 1, 2, 3, 4, 5} ;
      float c[5];
      int i;
     
      dot_vector(a,b,c,5);
     
      for(i=0;i<5;i++) {
        printf("%f\n",c[i]);
      }
     
      return 0;
    }

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

    Informations forums :
    Inscription : Décembre 2008
    Messages : 80
    Points : 41
    Points
    41
    Par défaut
    merci pour votre réponse oui, je me suis mal exprimer en faite le but final est de calculer le produit scalaire de deux vecteur donc aprés avoir fait le produit des deuc vecteur donc on aura un vecteur, aprés je somme les valeur de se vecteur en utilisant des shuffle se qui nous donne un vfloat32

Discussions similaires

  1. multiplication deux vecteurs de pointeurs
    Par africanwinners dans le forum Débuter
    Réponses: 3
    Dernier message: 27/08/2011, 16h15
  2. Réponses: 1
    Dernier message: 29/03/2007, 19h17
  3. Convolution cyclique entre deux vecteurs
    Par valencfaty dans le forum Mathématiques
    Réponses: 1
    Dernier message: 28/01/2007, 17h40
  4. [OCaml] Multiplication de deux polynômes
    Par snyper_ubi dans le forum Caml
    Réponses: 1
    Dernier message: 17/10/2006, 17h12
  5. Comparer le contenu de deux vecteurs
    Par misou83 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 20/07/2005, 17h17

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