Conversion de caractères non signés à flotteur dans l'assemblage (pour préparer des calculs de vecteurs de flotteur)

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

  •  10-10-2019
  •  | 
  •  

Question

Je suis en train d'optimiser une fonction à l'aide SSE2. Je me demande si je peux préparer les données pour mon code assembleur mieux que de cette façon. Mes données source est un tas de caractères non signés de pSrcData. Je copie à ce tableau de chars, comme mes besoins de calcul pour arriver à flotteur.


unsigned char *pSrcData = GetSourceDataPointer();

__declspec(align(16)) float vVectX[4];

vVectX[0] = (float)pSrcData[0];
vVectX[1] = (float)pSrcData[2];
vVectX[2] = (float)pSrcData[4];
vVectX[3] = (float)pSrcData[6];

__asm 
{
     movaps xmm0, [vVectX]
     [...]  // do some floating point calculations on float vectors using addps, mulps, etc
}

Y at-il un moyen plus rapide pour moi de lancer un sort tout autre octet de pSrcData à un flotteur et le stocker dans vVectX?

Merci!

Était-ce utile?

La solution

(1) et d'un masque à zéro les octets impairs (PAND)

(2) Décompresser de 16 bits à 32 bits (PUNPCKLWD avec un vecteur zéro)

(3) Autre 32 bits ints à flotteurs (CVTDQ2PS)

Instructions trois.

Autres conseils

Super vieux fil Je réalise, mais je cherchais un code moi-même pour le faire. Ceci est ma solution, que je pense est plus simple:

#include <immintrin.h>
#include <stdint.h>

#ifdef __AVX__
// Modified from http://stackoverflow.com/questions/16031149/speedup-a-short-to-float-cast
// Convert unsigned 8 bit integer to  float. Length must be multiple of 8
int  avxu8tof32(uint8_t *src, float *dest, int length) {
  int i;

  for (i=0; i<length; i+= 8) {

    //  Load 8 8-bit int into the low half of a 128 register
    __m128i v = _mm_loadl_epi64 ((__m128i const*)(src+i));

    //  Convert to 32-bit integers
    __m256i v32 = _mm256_cvtepu8_epi32(v);

    //  Convert to float
    __m256 vf = _mm256_cvtepi32_ps (v32);

    //  Store
    _mm256_store_ps(dest + i,vf);
  }
  return(0);
}
#endif

Cependant l'analyse comparative montre qu'il ne plus rapide qu'un simple boucle sur le tableau en C, avec l'optimisation du compilateur activé. Peut-être que l'approche sera plus utile que la phase initiale d'un tas de calculs AVX.

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