6

SSE4を使用して、1つの命令で複数の数値を比較することは可能ですか?

Intel Referenceは、PCMPGTQについて次のように述べています

PCMPGTQ —パックされたデータを比較して

デスティネーションオペランド(第1オペランド)とソースオペランド(第2オペランド)のパックされたクアドワードに対してSIMD比較を実行します。最初の(宛先)オペランドのデータ要素が2番目の(ソース)オペランドの対応する要素よりも大きい場合、宛先の対応するデータ要素はすべて1に設定されます。それ以外の場合は、0に設定されます。

ベクトル内でどの整数が大きいか、どれが小さいかを判断できるようにしたいので、これは実際には私が望んでいることではありません。

たとえば、比較する必要がある場合

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

[32, 13, 44, 99]あるベクトルと別のベクトルを入れて、 [45, 78, 12, 66]1つの命令でSSE4を使用してそれらを比較し、[0, 0, 1, 1]結果として(0-少ない、1-大きい)にすることを計画していました。

しかし、これはPCMPGTQが行うことではないようです。この比較を高速化するために、このレベルで並列処理を使用する方法に関する提案はありますか?

4

1 に答える 1

5

私はそれが実際PCMPGTにオペレーターの家族がしていることだと信じています。接尾辞は、要素のサイズを指定しますB-8ビット要素の場合W、16ビット要素の場合D、32ビット要素の場合Q、64ビット要素の場合。したがって、4つの32ビット数値を一度に比較する場合はPCMPGTD、128ビットのベクトル引数とともに使用します。これらのオペコードの擬似コードの説明については、このページを参照してください。

しかし、彼らはただ1または0を書くのではありません。それらは各要素にすべて1またはすべてゼロを書き込むので、usingと比較する0x1234567887654321と。0x8765432112345678PCMPGTB0x0000FFFFFFFF0000

このIntelホワイトペーパーは、ベクトル演算を使用して演算を実行するa[i] = (a[i] > b[i]) ? a[i] : b[i](つまり)優れた例を示しています。a[i] = max(a[i], b[i])

于 2012-09-24T04:12:34.883 に答える