6

是否可以使用 SSE4 在一条指令中比较多个数字?

英特尔参考说以下关于 PCMPGTQ

PCMPGTQ - 比较打包数据是否大于

对目标操作数(第一个操作数)和源操作数(第二个操作数)中的压缩四字执行 SIMD 比较。如果第一个(目标)操作数中的数据元素大于第二个(源)操作数中的对应元素,则将目标中对应的数据元素设置为全1;否则,设置为 0。

这并不是我真正想要的,因为我希望能够确定向量中哪些整数更大,哪些更小。

例如,如果我需要比较

32 with 45
13 with 78
44 with 12
99 with 66

我打算放入[32, 13, 44, 99]一个向量和[45, 78, 12, 66]另一个向量,并在一条指令中使用 SSE4 比较它们,并得到[0, 0, 1, 1]结果(0 - 更少,1 - 更大)

但这似乎不是 PCMPGTQ 所做的。有关如何在此级别使用并行性来加速此比较的任何建议?

4

1 回答 1

5

我相信这实际上是PCMPGT运营商家族所做的。后缀指定元素的大小 -B对于 8 位元素、W对于 16 位元素、D对于 32 位元素、Q对于 64 位元素。因此,如果您想一次比较 4 个 32 位数字,请使用PCMPGTD128 位向量参数。有关这些操作码的伪代码描述,请参阅此页面

但是,他们不只写1or 0;他们为每个元素写入全一或全零,以便0x12345678876543210x8765432112345678using进行比较PCMPGTB应该给出0x0000FFFFFFFF0000.

这份英特尔白皮书给出了一个使用向量操作执行操作a[i] = (a[i] > b[i]) ? a[i] : b[i](即)的简洁示例。a[i] = max(a[i], b[i])

于 2012-09-24T04:12:34.883 回答