2013-04-25 15 views
12

Sto leggendo la guida Intel intrinseca mentre implementavo il supporto SIMD. Ho alcune confusioni e le mie domande sono le seguenti.SIMD e differenza tra doppia precisione compatta e scalare

  1. __m128 _mm_cmpeq_ps (__m128 a, __m128 b) la documentazione dice che è usato per confrontare i punti flottanti a precisione singola imballati. Cosa significa "imballato"? Devo imballare i miei valori float in qualche modo prima che io possa usarli?

  2. Per la precisione doppia ci sono intrinseci come _mm_cmpeq_sd che significa confrontare gli elementi in virgola mobile a doppia precisione "inferiore". Che cosa significano gli elemtns di precisione inferiore e superiore? Posso usarli per confrontare un vettore di elementi di tipo C++ double o no? O devo elaborarli in qualche modo prima di confrontarli?

risposta

14

In SSE, i registri a 128 bit possono essere rappresentati come 4 elementi di 32 bit.

SSE definisce due tipi di operazioni; scalare e imballato. L'operazione scalare funziona solo sull'elemento di dati meno significativi (bit 0 ~ 31) e l'operazione di compressione calcola tutti e quattro gli elementi in parallelo.

_mm_cmpeq_sd confronta solo l'elemento di dati meno significativi (primi 32 bit) dei due operandi mentre _mm_cmpeq_ps confronta ciascun gruppo di 32 bit in parallelo.

Se si utilizza il doppio di 64 bit, è possibile impacchettare il doppio per coppia per utilizzare lo spazio a 128 bit. In questo modo, _mm_cmpeq_ps sarebbe in grado di effettuare due comparazioni di 4 doppie in parallelo.

Se si desidera effettuare un solo confronto alla volta, è possibile utilizzare _mm_cmpeq_pd per confrontare due 64 bit doppio.

Si noti che _mm_cmpeq_pd è SSE2 mentre _mm_cmpeq_ps è SSE.

9

In questo contesto, "impacchettato" significa "più dello stesso tipo inserito in un unico grumo" - quindi "punto mobile in virgola mobile a precisione singola" significa 4 * numeri in virgola mobile a 32 bit memorizzati come valore a 128 bit.

È necessario "impacchettare" ciascun valore nel registro utilizzando varie istruzioni PACK* oppure i dati sono già stati "impacchettati" in memoria, ad es. una serie di (multipli di) 4 valori in virgola mobile [che sono opportunamente allineati].

Scalare significa "un valore" nei bit n inferiori del registro (ad esempio uno double sarebbe il basso 64 bit di un registro SSE a 128 bit).