簡體   English   中英

AVX2:AVX 寄存器中 8 位元素的 CountTrailingZeros

[英]AVX2: CountTrailingZeros on 8 bit elements in AVX register

我想要一個 function 的實現,比如_mm256_lzcnt_epi8(__m256i a) ,其中對於每個 8 位元素,計算並提取尾隨零的數量。

在上一個實現前導零計數的問題中,有一個使用查找表的解決方案。 我想知道是否可以為此使用相同的方法。

請僅使用 AVX 和0作為輸入的行為可以是未定義的。

AVX2:AVX 寄存器中 8 位元素的 BitScanReverse 或 CountLeadingZeros

謝謝你的幫助!

該問題中 chtz 的答案相同的 LUT 應該可以工作。

飽和技巧將不起作用,但_mm256_blendv_epi8可用於 select 使用 LUT 結果。

低 LUT 是值 0..15 的答案,對於 0,通過 blendv 在另一個 LUT 中看到是 0xFF。

像這樣(未測試):

__m256i ctz_epu8(__m256i values)
{
    // extract upper nibble:
    __m256i hi = _mm256_and_si256(_mm256_srli_epi16(values, 4), _mm256_set1_epi8(0xf));
    // extract lower nibble:
    __m256i lo = _mm256_and_si256(values, _mm256_set1_epi8(0xf));

                                                                   // 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0 
    const __m256i lookup_hi = _mm256_broadcastsi128_si256(_mm_set_epi8(4, 5, 4, 6, 4, 5, 4, 7, 4, 5, 4, 6, 4, 5, 4, 8));
    
                                                                   // 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
    const __m256i lookup_lo = _mm256_broadcastsi128_si256(_mm_set_epi8(0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 0xFF));

    // look up each half
    __m256i clz_hi = _mm256_shuffle_epi8(lookup_hi, hi);
    __m256i clz_lo = _mm256_shuffle_epi8(lookup_lo, lo);

    // combine results
    return _mm256_blendv_epi8(clz_lo, clz_hi, clz_lo);
}
__m128i ssse3_tzcnt_epi8(__m128i v) {
    const __m128i lut_lo = _mm_set_epi8(0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 8);
    const __m128i lut_hi = _mm_set_epi8(4, 5, 4, 6, 4, 5, 4, 7, 4, 5, 4, 6, 4, 5, 4, 8);
    const __m128i nibble_mask = _mm_set1_epi8(0x0F);
    __m128i t;

    t = _mm_and_si128(nibble_mask, v);
    v = _mm_and_si128(_mm_srli_epi16(v, 4), nibble_mask);
    t = _mm_shuffle_epi8(lut_lo, t);
    v = _mm_shuffle_epi8(lut_hi, v);
    v = _mm_min_epu8(v, t);
    return v;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM