2011-07-29 46 views
10

我有兩個向量,每個都有4個整數,我想用SIMD命令來比較它們(比如根據比較結果生成每個條目爲0或1的結果向量)。如何使用SIMD比較兩個向量並獲得單個布爾結果?

然後,我想將結果向量與4個零的向量進行比較,並且只在它們相等時才執行某些操作。

你知道我可以用它來做什麼SIMD命令嗎?

+1

哪些建築是你使用?所有SIMD都不同。 – Phonon

+0

我對此非常非常新,所以請原諒我的無知。我正在嘗試使用英特爾Parallel Studio的平臺包含SIMD命令(這是否以任何方式回答您的問題?)。 –

回答

14

要比較兩個SIMD矢量:

#include <stdint.h> 
#include <xmmintrin.h> 

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 }; 
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 }; 
int32_t __attribute__ ((aligned(16))) result[4]; 

__m128i v1 = _mm_load_si128((__m128i *)vector1); 
__m128i v2 = _mm_load_si128((__m128i *)vector2); 
__m128i vcmp = _mm_cmpeq_epi32(v1, v2); 
_mm_store_si128((__m128i *)result, vcmp); 

注意:假設

  • 數據爲32個整數
  • vector1vector2result都需要16字節對齊
  • 結果將等於-1,不等於0(以上代碼示例爲{ -1, -1, 0, 0 }

UPDATE

如果你只是想的情況下的單布爾結果,所有4個元素匹配,那麼你可以做這樣的:

#include <stdint.h> 
#include <xmmintrin.h> 

int32_t __attribute__ ((aligned(16))) vector1[4] = { 1, 2, 3, 4 }; 
int32_t __attribute__ ((aligned(16))) vector2[4] = { 1, 2, 2, 2 }; 

__m128i v1 = _mm_load_si128((__m128i *)vector1); 
__m128i v2 = _mm_load_si128((__m128i *)vector2); 
__m128i vcmp = _mm_cmpeq_epi32(v1, v2); 
uint16_t mask = _mm_movemask_epi8(vcmp); 
int result = (mask == 0xffff); 
+0

謝謝。當我得到結果向量時,是否有一種簡單的方法來檢查它是否全爲零(我想要一個布爾值來表示它是否全爲零)。 –

+0

我可以使用_mm_cmpgt_epi32,如果我想獲得更大的結果,對嗎? –

+0

@ N.M:查看上面更新的答案。 –