2017-10-19 16 views
5

Je souhaite extraire 8 bits d'une variable de registre __mm256i src avec 8 positions spécifiées par un autre __mm256i offset qui est composé de 8 entiers. Par exemple: si offset est [1,3,5,21,100,200,201,202], je veux obtenir les 1er, 3ème, 5ème, 100ème, 200ème, 201ème, 202ème bits de src et les emballer dans un int8.Extraction de bits avec SIMD

Cette question est similaire à Extracting bits using bit manipulation, mais je veux une solution avec des instructions SIMD, car elle est beaucoup plus rapide.

Répondre

4
  1. Sélectionnez 3 bits élevés dans chaque élément et sélectionnez l'élément 32 bits requis en utilisant _mm256_permutevar8x32_epi32() intrinsèque.
  2. Sélectionnez les 5 bits inférieurs dans chaque élément de vecteur et créez un masque de bits à l'aide de _mm256_sllv_epi32() intrinsèque.
  3. Résultat du paquet à int8 en utilisant _mm256_movemask_ps() (jeté __m256i à __m256).

Il est un exemple ci-dessous:

uint8_t Select(__m256i offset, __m256i src) 
{ 
    __m256i permutedSrc = _mm256_permutevar8x32_epi32(src, _mm256_srli_epi32(offset, 5)); 
    __m256i shift = _mm256_and_si256(offset, _mm256_set1_epi32(31)); 
    __m256i bitmask = _mm256_sllv_epi32(_mm256_set1_epi32(1), shift); 
    __m256i mask = _mm256_cmpeq_epi32(_mm256_and_si256(permutedSrc, bitmask), _mm256_setzero_si256()); 
    return ~_mm256_movemask_ps(_mm256_castsi256_ps(mask)); 
} 
+0

il fonctionne parfaitement. – jianqiang

+0

Je me demande si 'VPSHUFBITQMB' aidera ici. Bien que nous ne verrons pas cette instruction jusqu'à Ice Lake. – Mysticial