Quelle est la façon la plus efficace de la charge et l'extrait 32 valeurs entières de bits d'un 128 bit vecteur SSE?

StackOverflow https://stackoverflow.com/questions/4360920

  •  08-10-2019
  •  | 
  •  

Question

Je suis en train d'optimiser mon code en utilisant intrinsics SSE, mais je suis en cours d'exécution dans un problème où je ne sais pas d'une bonne façon d'extraire les valeurs entières d'un vecteur après que je l'ai fait les opérations de l'ESS pour obtenir ce que Je veux.

Quelqu'un sait-il d'une bonne façon de le faire? Je suis la programmation en C et mon compilateur gcc version 4.3.2.

Merci pour votre aide.

Était-ce utile?

La solution

Cela dépend de ce que vous pouvez supposer sur le niveau minimum de soutien SSE que vous avez.

Aller tout l'arrière de façon à SSE2 vous avez _mm_extract_epi16 (PEXTRW) qui peut être utilisé pour extraire tout élément 16 bits d'un vecteur de 128 bits. Vous auriez besoin d'appeler cela deux fois pour obtenir les deux moitiés d'un élément 32 bits.

Dans les versions les plus récentes de l'ESS (SSE4.1 et versions ultérieures) vous avez _mm_extract_epi32 (PEXTRD) qui peut extraire un élément 32 bits dans une instruction.

Par ailleurs, si ce n'est pas dans une boucle critique la performance, vous pouvez simplement utiliser un syndicat, par exemple.

typedef union
{
    __m128i v;
    int32_t a[4];
} U32;

Autres conseils

_mm_extract_epi32

L'extrait est en effet intrinsics la meilleure option, mais si vous avez besoin pour soutenir SSE2, je vous recommande ceci:

inline int get_x(const __m128i& vec){return _mm_cvtsi128_si32 (vec);}
inline int get_y(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0x55));}
inline int get_z(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xAA));}
inline int get_w(const __m128i& vec){return _mm_cvtsi128_si32 (_mm_shuffle_epi32(vec,0xFF));}

J'ai trouvé que si vous reinterpret_cast / union vecteur à un int [4] représentation du compilateur a tendance à des choses flush Retour à la mémoire (qui ne peut pas être si mauvais) et relit comme un entier, mais je havre de paix « t regarda l'assemblée pour voir si les dernières versions des compilateurs génèrent un meilleur code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top