我正在对图像进行普查转换,每个像素进行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),对吗?至少,通常比较会导致这种情况。