如何并行比较两个以上的数字?

时间:2012-09-24 04:07:46

标签: c algorithm parallel-processing sse sse4

是否可以使用SSE4在一条指令中比较一对以上的数字?

Intel Reference说以下关于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所做的。关于如何在这个级别使用并行性来加速这种比较的任何建议?

1 个答案:

答案 0 :(得分:5)

我认为这实际上是PCMPGT运营商家族所做的事情。后缀指定元素的大小 - 8位元素为B,16位元素为W,32位元素为D,64-为Q位元素。因此,如果要一次比较4个32位数,请使用带有128位向量参数的PCMPGTD。有关这些操作码的伪代码描述,请参阅this page

他们不会只写10;他们为每个元素编写全1或全0,因此使用0x12345678876543210x8765432112345678PCMPGTB进行比较时应该0x0000FFFFFFFF0000

This Intel white paper给出了一个使用向量运算执行操作a[i] = (a[i] > b[i]) ? a[i] : b[i](即a[i] = max(a[i], b[i]))的简洁示例。