我正在对图像进行普查转换,每个像素进行32个比较。我可以有效地生成一个256位 vector 0x0100010100010100 ...,其中每个8位对应于0x00或0x01。该载体在下面被标识为“比较”。我需要折叠此256位 vector 以生成32位汉明字符串。数组“普查”是我存储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),对吗?至少,通常比较会导致这种情况。

08-16 00:15