2017-10-19 227 views
5

我想從一個由8個整數組成的另一個__mm256i offset指定的8個位置從一個寄存器變量__mm256i src中提取8個比特。 例如:如果offset[1,3,5,21,100,200,201,202],我想從src獲得第1,3,5,10,100,121,202位,並將它們打包到int8用SIMD提取比特

這個問題類似於Extracting bits using bit manipulation,但我想用SIMD指令的解決方案,因爲它的速度要快得多。

回答

4
  1. 在每個元素中選擇高位3位,並使用固有的_mm256_permutevar8x32_epi32()選擇所需的32位元素。
  2. 在矢量的各元素中選擇低5位,並與使用的固有_mm256_sllv_epi32創建位掩碼()。
  3. 包結果與使用的_mm256_movemask_ps()INT8(投__m256i到__m256)。

下面有一個例子:

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

它完美的作品。 – jianqiang

+0

我想知道'VPSHUFBITQMB'會在這裏有所幫助。雖然我們不會在冰湖之前看到這條指令。 – Mysticial