在C中是否有一种无分支技术来计算两个无符号整数之间的绝对差值?例如,给定变量a和b,对于a = 3,b = 5或b = 3,a = 5的情况,我希望值为2.理想情况下,我还希望能够使用SSE寄存器对计算进行矢量化.
有几种方法可以做到,我只提一个:
SSE4
PMINUD和PMAXUD分隔寄存器#1中较大的值和寄存器#2中较小的值.MMX/SSE2
PCMPGTD.将此结果用作蒙版.(a-b)和(b-a)POR ( PAND ( mask, a-b ), PANDN ( mask, b-a ) )选择的绝对差值正确的值.在tommesani.com 上,此问题的一种解决方案是使用两次饱和无符号减法。
由于饱和减法永远不会低于 0,您计算: r1 = (ab).saturating r2 = (ba).saturating
如果 a 大于 b,r1 将包含答案,r2 将为 0,反之亦然 b>a。OR 将两个部分结果放在一起将产生所需的结果。
根据VTUNE 用户手册,PSUBUSB/PSUBUSW 可用于 128 位寄存器,因此您应该能够通过这种方式获得大量并行化。
max(i,j) - min(i,j)
(i>j)*(i-j) + (j>i)*(j-i)
Run Code Online (Sandbox Code Playgroud)
你当然可以使用 SSE 寄存器,但编译器可能会为你做这件事