2010-06-28 30 views
5

J'écris un code SSE en 2D convolution mais la documentation SSE est très clairsemée. Je calcule le produit scalaire avec _mm_dp_ps et j'utilise _mm_extract_ps pour obtenir le résultat du produit scalaire, mais _mm_extract_ps renvoie un hexagone qui représente un flottant et je n'arrive pas à comprendre comment convertir ce flottant hexadécimal en float normal. Je pourrais utiliser __builtin_ia32_vec_ext_v4sf qui retourne un float mais je veux garder la compatibilité avec les autres compilateurs.Comment convertir un flottant hexadécimal en flottant en C/C++ en utilisant _mm_extract_ps SSE GCC fonction instrinc

_mm_extract_ps (__m128 __X, const int __N) 
{ 
    union { int i; float f; } __tmp; 
    __tmp.f = __builtin_ia32_vec_ext_v4sf ((__v4sf)__X, __N); 
    return __tmp.i; 
} 

Quel est le point qui me manque?

Un petit coup de main sera apprécié, merci.

OpenSUSE 11.2
GCC 4.4.1
C++
Options du compilateur
-fopenmp -Wall -O3 -msse4.1 -march = Core2
Options Linker
-lgomp -Wall -O3 -msse4. 1 -march = core2

Répondre

5

Vous devriez pouvoir utiliser _MM_EXTRACT_FLOAT.

Soit dit en passant, il me semble que si _mm_extract_ps et _MM_EXTRACT_FLOAT devrait être l'inverse, à savoir _mm_extract_ps REVERSE un flotteur et _MM_EXTRACT_FLOAT doit retourner la représentation int, mais qu'est-ce que je sais.

+2

Je pensais ça aussi. –

+0

Je suppose que c'est à la manière dont Intel décrit l'instruction dans sa documentation, ce qui peut ou peut ne pas être une erreur - les en-têtes gcc implémentent simplement ce qui est dans la documentation. –

1

_mm_cvtss_f32(_mm_shuffle_ps(__X, __X, __N)) fera le travail.

0

extern void _mm_store_ss (float *, __m128);

Voir 'xmmintrin.h.'