Intel® ISA Extensions
Use hardware-based isolation and memory encryption to provide more code protection in your solutions.

AVX-512 tzcnt

Johannes_P_
Beginner
1,550 Views

Hi @ all,

I am currently working with AVX-512 on a KNL. I wanted to test one the new conflict detection functions (_mm512_conflict_epi32). The result of this call is a zero-extended bitvector. To use this for further computations, I want to use a vectorized trailing zeros count but I only found a vectorized leading zeros count. _tzcnt_u32 (AVX2) and _mm_tzcnt_32 (AVX-512) are working with scalar types. Is it wright, that I have to perform the trailing zero count on a scalar level or does anyone know a vectorized way (maybe by swapping the endianess and perform a lzc afterwards)? Thanks for your effort!

Sincerely yours

0 Kudos
1 Solution
andysem
New Contributor III
1,550 Views

Trailing zero count can be computed from the leading zero count like this:

uint32_t tzcnt(uint32_t x)
{
    if (x == 0u)
        return 32u;
    return 31u - _lzcnt_u32((x - 1u) ^ x);
}

which you could convert to vector instructions.

 

View solution in original post

0 Kudos
1 Reply
andysem
New Contributor III
1,551 Views

Trailing zero count can be computed from the leading zero count like this:

uint32_t tzcnt(uint32_t x)
{
    if (x == 0u)
        return 32u;
    return 31u - _lzcnt_u32((x - 1u) ^ x);
}

which you could convert to vector instructions.

 

0 Kudos
Reply