2017-10-19 25 views
5

Tôi muốn trích xuất 8 bit từ biến đăng ký __mm256i src với 8 vị trí được chỉ định bởi __mm256i offset khác bao gồm 8 số nguyên. Ví dụ: nếu offset[1,3,5,21,100,200,201,202], tôi muốn nhận các bit 1, 3, 5, 100, 200, 201, 202nd từ src và đóng gói chúng thành int8.Trích xuất các bit với SIMD

Câu hỏi này tương tự như Extracting bits using bit manipulation, nhưng tôi muốn có giải pháp với hướng dẫn SIMD vì nó nhanh hơn nhiều.

Trả lời

4
  1. Chọn 3 bit cao trong mỗi phần tử và chọn phần tử 32 bit bắt buộc bằng cách sử dụng nội tại _mm256_permutevar8x32_epi32().
  2. Chọn 5 bit thấp trong mỗi phần tử của vector và tạo mặt nạ bit bằng cách sử dụng nội tại _mm256_sllv_epi32().
  3. Kết quả gói thành int8 bằng cách sử dụng _mm256_movemask_ps() (truyền __m256i đến __m256).

Có một ví dụ dưới đây:

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

nó hoạt động hoàn hảo. – jianqiang

+0

Tôi tự hỏi nếu 'VPSHUFBITQMB' sẽ trợ giúp ở đây. Mặc dù chúng tôi sẽ không nhìn thấy chỉ dẫn đó cho đến khi Ice Lake. – Mysticial

Các vấn đề liên quan