我处理8个分量的彩色像素,每个颜色分量的深度为16位。说,CMYK + 4种其他专色,但这无关紧要:重要的是,每种颜色都可以用array [0 .. 7] of word
表示。
好吧,在我们正在讨论的特定应用中,使用32位“代理”更方便,实际上,根据颜色计算出的 32位校验和是一种特定的方式。当然,我会处理两个相同的校验和仍代表不同颜色的不太可能的情况。这样做的想法是尽可能地减少这种情况,也就是说,校验和应该尽可能地随机,并且它们的计算必须非常快。我被允许最多使用SIMD
的Intel / AMD SSE 4.1
。
我的想法如下:
类似这样的东西:
movdqa xmm0, COLORPIXEL // the color to get the checksum from
movdqa xmm1, WEIGHTCONST // e.g. (32749, 32647, 32573, 32503, 32719, 32633, 32569, 32497)
paddw xmm0, ADDCONST // e.g. (32687, 32587, 32531, 32441, 32653, 32579, 32507, 32429)
pmaddwd xmm1, xmm0
phaddd xmm1, xmm1
phaddd xmm1, xmm1
movd eax, xmm1 // result in 32 bits register
此代码似乎足够好且相当快,但是我们欢迎更好的主意。我以前从未使用过校验和,因此很有可能采用传统的解决方案,例如数据传输中使用不同的CRC将是更好的选择。
注意: