2015-06-19 55 views
1

我正在对每个像素执行32次比较的图像进行普查转换。我可以高效地生成一个0x0100010100010100的256位向量......其中每个8位对应0x00或0x01。该向量在下面标识为“比较”。我需要折叠这个256位向量来生成一个32位汉明串。数组'人口普查'是我存储8位比较的地方。请注意,在这一点上,我不在乎汉明距离,我只是尽可能快地生成字符串。我有AVX2提供给我。我当前的代码:从32位8位比较中形成32位汉明字符串

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)); 

回答

4

这几乎正是_mm256_movemask_epi8是,不同的是它的字节而不是最低显著比特的前位。所以先把它左移7。

或者,改变你如何产生这些字节,因为你可能使它们分别为0x00或0xFF分别为false和true,对吗?至少,通常比较会导致这种情况。

+0

我很快就发布了这篇文章,我走了一小步,想到自己, “为什么不是已经是内在的?果然,它是。 –