使用SSE4.1

时间:2019-07-12 09:01:17

标签: assembly x86 sse checksum micro-optimization

我处理8个分量的彩色像素,每个颜色分量的深度为16位。说,CMYK + 4种其他专色,但这无关紧要:重要的是,每种颜色都可以用array [0 .. 7] of word表示

好吧,在我们正在讨论的特定应用中,使用32位“代理”更方便,实际上,根据颜色计算出的 32位校验和是一种特定的方式。当然,我会处理两个相同的校验和仍代表不同颜色的不太可能的情况。这样做的想法是尽可能地减少这种情况,也就是说,校验和应该尽可能地随机,并且它们的计算必须非常快。我被允许最多使用SIMD的Intel / AMD SSE 4.1

我的想法如下:

  1. 为每个组件添加不同的预定义常量(最好是质数),以消除空组件,
  2. 通过乘以不同的质数来加权这些分量,
  3. 使所得双字之和。

类似这样的东西:

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将是更好的选择。

注意:

  1. 一种颜色通常(但不是强制性的)只有一些非零成分,通常最多为3。
  2. 将非零点分量(即索引为4或更高)与不止一个其他非零分量配对的情况很少见。
  3. 专色本身比CMYK颜色(索引0到3)少得多。
  4. 65535(全色调)的值可能比其他随机值更频繁。

0 个答案:

没有答案
相关问题