c++ - 32 位 8 位比较形成的 32 位汉明字符串

标签 c++ c sse simd avx

我正在对图像执行普查变换,每个像素进行 32 次比较。我可以高效地生成 0x0100010100010100... 的 256 位 vector ,其中每个 8 位对应于 0x00 或 0x01。该载体在下面被标识为“比较”。我需要折叠这个 256 位 vector 以生成 32 位汉明字符串。数组“census”是我存储 8 位比较的地方。请注意,此时我不关心汉明距离,我只对尽快生成字符串感兴趣。我有可用的 AVX2。我当前的代码:

uint8_t* census = (uint8_t*) _mm_malloc(sizeof(int)*8,32);

...

_mm256_storeu_si256((__m256i*) census, comparisons);

uint32_t hammingString = (uint32_t) (census[0] +
                                    (census[1] << 1)   +
                                    (census[2] << 2)   +
                                    ...
                                    (census[31] << 31));

最佳答案

这几乎就是_mm256_movemask_epi8是为了,除了它采用字节的最高位而不是最低有效位。所以先左移 7。

或者,更改生成这些字节的方式,因为您可能将它们分别设为 0x00 或 0xFF 以表示 false 和 true,对吗?至少,通常比较会产生那种结果。

关于c++ - 32 位 8 位比较形成的 32 位汉明字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945128/

相关文章:

c++ - QT 布局小部件调整大小

c - 为什么函数在 C 中不被视为一等公民

c - 从输入文件中删除注释的 Lex 程序

visual-studio-2005 - VS2005 中的 SSE4 指令?

c# - 硬件SIMD解析可提高C#性能

c++ - 数组中的重复值

c++ - 由于 RVO,const 引用不会延长 temp 的生命周期?

c++ - C/C++中的所有函数都在哪里定义的?

intel - 以原子方式比较 2 个 64 位整数所需的最低 SSE/AVX 版本?

c++ - vector<auto_ptr<>> 的编译问题