如何从lsb的__m64值创建一个8位掩码?

yad*_*dhu -1 c++ simd avx mmx avx2

我有一个用例,其中我有位数组,每个位表示为8位整数,例如uint8_t data[] = {0,1,0,1,0,1,0,1};我想通过仅提取每个值的lsb来创建一个整数.我知道使用int _mm_movemask_pi8 (__m64 a)函数我可以创建一个掩码但这个内在函数只需要一个字节的msb而不是lsb.是否有类似的内在或有效方法来提取lsb以创建单个8位整数?

har*_*old 5

没有直接的方法可以做到这一点,但显然你可以简单地将lsb转换为msb,然后将其解压缩:

_mm_movemask_pi8(_mm_slli_si64(x, 7))
Run Code Online (Sandbox Code Playgroud)

这些天使用MMX很奇怪,应该避免使用.

这是一个SSE2版本,仍然只读取8个字节:

int lsb_mask8(uint8_t* bits) {
    __m128i x = _mm_loadl_epi64((__m128i*)bits);
    return _mm_movemask_epi8(_mm_slli_epi64(x, 7));
}
Run Code Online (Sandbox Code Playgroud)

使用SSE2代替MMX可以避免使用 EMMS

  • @yadhu这个转变本身不应该很慢,你能否确认它实际上是转变而不是通常的"成本误报"将责任从缓慢的负载转移到使用负载结果的操作? (2认同)