2010-06-28 11 views
5

Sto scrivendo un codice SSE in convoluzione 2D ma la documentazione SSE è molto scarsa. Sto calcolando il prodotto punto con _mm_dp_ps e utilizzando _mm_extract_ps per ottenere il risultato del prodotto del punto, ma _mm_extract_ps restituisce un esadecimale che rappresenta un valore float e non riesco a capire come convertire questo float esadecimale in un float normale. Potrei usare __builtin_ia32_vec_ext_v4sf che restituisce un float ma voglio mantenere la compatibilità con altri compilatori.Come convertire un float esadecimale in un float in C/C++ usando _mm_extract_ps SSE GCC instrinc function

_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; 
} 

Che punto mi manca?

Un piccolo aiuto sarà apprezzato, grazie.

OpenSUSE 11.2
GCC 4.4.1
C++
opzioni del compilatore
-fopenmp -Wall -O3 -msse4.1 -march = Core2
opzioni del linker
-lgomp -Wall -O3 -msse4. 1 -march = core2

risposta

5

Dovresti essere in grado di utilizzare _MM_EXTRACT_FLOAT.

Tra l'altro mi sembra come se _mm_extract_ps e _MM_EXTRACT_FLOAT dovrebbe essere il contrario, vale a dire _mm_extract_ps dovrebbe restituire un galleggiante e _MM_EXTRACT_FLOAT dovrebbe restituire la rappresentazione int, ma che ne so io.

+2

Ho pensato anch'io. –

+0

Suppongo che dipenda dal modo in cui Intel descrive le istruzioni contenute nella loro documentazione, il che può essere o meno un errore: le intestazioni di gcc implementano semplicemente ciò che è presente nella documentazione. –

1

_mm_cvtss_f32(_mm_shuffle_ps(__X, __X, __N)) farà il lavoro.

0

extern void _mm_store_ss (float *, __m128);

Vedere "xmmintrin.h."