c++ 使用AVX/SIMD查找16位值第一次出现的索引

uinbv5nw  于 2023-06-07  发布在  其他
关注(0)|答案(1)|浏览(158)

我试图返回256位中第一个16位值的索引。
我知道如何对8位执行此操作,使用:

int _mm256_movemask_epi8 (__m256i a)

但是,似乎没有16位等效的内部。
推荐的方法是什么?

gmxoilav

gmxoilav1#

从评论来看,似乎最好的方法是这样的...(未检测)

__m256i veca = _mm256_set1_epi16(a);           // a is 16bit value you're looking for...
__m256i cmp = _mm256_cmpeq_epi16(veca, vecb);  // vecb is the vector you want to search
uint32_t mask = _mm256_movemask_epi8(cmp);     // cmp elements are 0 or 0xffff if no-match or match resp.
uint32_t index = 0;                            // mask is most significant bit of each byte in cmp
if (mask != 0) {
  index = (30 - lzcnt32(mask))/2;              // index is 0-15, 0 on right (higher address).
} else {
  ..no match.
}

相关问题