Forum Programmation.c multiplication double-precision avec SSE

Posté par .
Tags : aucun
0
13
mar.
2010
Bonjour,

Je débute avec SSE et je cherche à faire une opération relativement simple, mais en double-precision.

J'ai un tableau de 2 double, que je veux multiplier par 1 double

en gros :


double arr[] = { 5., 3. };
double res[2];
double t = 2.;


et j'aimerai obtenir:


res[0] = arr[0] * t;
res[1] = arr[1] * t;


en utilisant SSE

Le problème est que les 2 fonctions de multiplication proposées dans sont :


__m128 _mm_mul_ps (const __m128 & a, const __m128 & b);
// qui fait des multiplication de float
(float) res[0] = a[0] * b[0];
(float) res[1] = a[1] * b[1];
(float) res[2] = a[2] * b[2];
(float) res[3] = a[3] * b[3];


et :

__m128 _mm_mul_ss (const __m128 & a, const __m128 & b);
(float) res[0] = a[0] * b[0];
(float) res[1] = a[1];
(float) res[2] = a[2];
(float) res[3] = a[3];


Quelqu'un à une idée de la manière de faire ma multiplication en double ?

En espérant avoir été assez clair

Merci d'avance
  • # Erratum

    Posté par . Évalué à 1.

    Bon les signatures des fonctions _mm_* ne sont pas des const ref mais mon problème est le même.
  • # Trouvé

    Posté par . Évalué à 2.

    Bon désolé pour ce message, j'ai finalement trouvé (comme quoi je n'avais pas assez cherché).

    Si ca peut servir à d'autre, à partir de SSE2

    on peut trouvé les fonctions :

    pour affecter 2x le meme double :
    __m128d _mm_set_pd1 (double d);

    et pour multiplier 2 doubles 2 a 2:
    __m128d _mm_mul_pd (__m128d a, __m128d b);

    dans emmintrin.h
    • [^] # use the compiler, luke

      Posté par (page perso) . Évalué à 6.

      Alors en pratique, si tu laisses faire le compilo, il va sans doute faire ça mieux que toi.
      http://www.linux-kongress.org/2009/slides/compiler_survey_fe(...)

      pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

      • [^] # Re: use the compiler, luke

        Posté par (page perso) . Évalué à 2.

        Il n'y a pas une histoire comme quoi les fonctions qui commencent avec des underscore sont à éviter car pas destinées à l'utilisateur ?

        Envoyé depuis mon lapin.

      • [^] # Re: use the compiler, luke

        Posté par (page perso) . Évalué à 2.

        Toutafé. D'ailleurs les options -msse2 -mfpmath=sse permettent d'utiliser les instructions SSE scalaires pour les calculs à virgule flottante (en lieu et place de celles du x87). On peut remplacer -msse2 par -msse, -msse3, -msse4, etc... en fonction du niveau SSE supporté par le processeur cible. Sur les plateformes x86_64 ces options sont activées par défaut.

        En supplément on peut utiliser le vectoriseur automatique de gcc, activé par défaut avec -O3 , et suivre le travail de ce vectoriseur avec l'option -ftree-vectorizer-verbose=N avec N>=1.
      • [^] # Re: use the compiler, luke

        Posté par . Évalué à 2.

        On va dire que c'est une réponse au problème plus général. Mais pour ce problème particulier, son commentaire est tout à fait pertinent.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.