[英]How to compare more than two numbers in parallel?
是否可以使用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,0,1,1 [0, 0, 1, 1]
結果(0 - 少,1 - 更大)
但似乎這不是PCMPGTQ所做的。 有關如何在此級別使用並行性來加速此比較的任何建議?
我相信這實際上是PCMPGT
系列運營商所做的。 后綴指定元素的大小 - 對於8位元素為B
,對於16位元素為W
,對於32位元素為D
,對於64位元素為Q
因此,如果要一次比較4個32位數字,請使用帶有128位向量參數的PCMPGTD
。 有關這些操作碼的偽代碼說明,請參閱此頁面 。
但是,它們不會只寫1
或0
; 他們為每個元素寫入全1或全0,因此使用PCMPGTB
將0x1234567887654321
與0x8765432112345678
進行PCMPGTB
應該給出0x0000FFFFFFFF0000
。
這篇英特爾白皮書給出了一個簡單的例子來執行a[i] = (a[i] > b[i]) ? a[i] : b[i]
a[i] = (a[i] > b[i]) ? a[i] : b[i]
(即a[i] = max(a[i], b[i])
)使用向量運算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.