使用SSE计算无符号整数之间的绝对差值

Jac*_*ock 10 c++ unsigned sse

在C中是否有一种无分支技术来计算两个无符号整数之间的绝对差值?例如,给定变量a和b,对于a = 3,b = 5或b = 3,a = 5的情况,我希望值为2.理想情况下,我还希望能够使用SSE寄存器对计算进行矢量化.

rwo*_*ong 8

有几种方法可以做到,我只提一个:

SSE4

  • 使用PMINUDPMAXUD分隔寄存器#1中较大的值和寄存器#2中较小的值.
  • 减去它们.

MMX/SSE2

  • 翻转两个值的符号位,因为下一条指令只接受有符号整数比较.
  • PCMPGTD.将此结果用作蒙版.
  • 同时计算结果(a-b)(b-a)
  • 使用POR ( PAND ( mask, a-b ), PANDN ( mask, b-a ) )选择的绝对差值正确的值.


Jus*_*n W 5

tommesani.com 上,此问题的一种解决方案是使用两次饱和无符号减法。

由于饱和减法永远不会低于 0,您计算: r1 = (ab).saturating r2 = (ba).saturating

如果 a 大于 b,r1 将包含答案,r2 将为 0,反之亦然 b>a。OR 将两个部分结果放在一起将产生所需的结果。

根据VTUNE 用户手册,PSUBUSB/PSUBUSW 可用于 128 位寄存器,因此您应该能够通过这种方式获得大量并行化。


Any*_*orn 4

max(i,j) - min(i,j)
(i>j)*(i-j) + (j>i)*(j-i)
Run Code Online (Sandbox Code Playgroud)

你当然可以使用 SSE 寄存器,但编译器可能会为你做这件事