Laz*_*zer 6 c algorithm parallel-processing sse sse4
是否可以使用SSE4在一条指令中比较一对以上的数字?
英特尔参考咨询有关PCMPGTQ的内容如下
PCMPGTQ - 比较大于的打包数据
对目标操作数(第一个操作数)和源操作数(第二个操作数)中的压缩四字进行SIMD比较.如果第一个(目标)操作数中的数据元素大于第二个(源)操作数中的相应元素,则目标中的相应数据元素将设置为全1; 否则,它被设置为0.
这不是我想要的,因为我希望能够决定哪些整数更大,哪些整数更小.
例如,如果我需要比较
32 with 45
13 with 78
44 with 12
99 with 66
Run Code Online (Sandbox Code Playgroud)
我打算在一个指令中放入[32, 13, 44, 99]
一个向量和[45, 78, 12, 66]
另一个向量并使用SSE4进行比较,[0, 0, 1, 1]
结果为(0 - 更少,1 - 更大)
但似乎这不是PCMPGTQ所做的.有关如何在此级别使用并行性来加速此比较的任何建议?
我相信这实际上就是PCMPGT
运营商家族所做的事情.后缀指定元素的大小 - B
对于8位元素,W
对于16位元素,D
对于32位元素,Q
对于64位元素.因此,如果要一次比较4个32位数字,请使用PCMPGTD
128位向量参数.有关这些操作码的伪代码说明,请参阅此页面.
但是,他们不会写1
或者0
; 他们将all-one或all-zero写入每个元素,因此0x1234567887654321
与0x8765432112345678
使用的比较PCMPGTB
应该给出0x0000FFFFFFFF0000
.
本英特尔白皮书给出了使用向量运算执行操作a[i] = (a[i] > b[i]) ? a[i] : b[i]
(即a[i] = max(a[i], b[i])
)的简洁示例.