我有兩個向量,每個都有4個整數,我想用SIMD命令來比較它們(比如根據比較結果生成每個條目爲0或1的結果向量)。如何使用SIMD比較兩個向量並獲得單個布爾結果?
然後,我想將結果向量與4個零的向量進行比較,並且只在它們相等時才執行某些操作。
你知道我可以用它來做什麼SIMD命令嗎?
我有兩個向量,每個都有4個整數,我想用SIMD命令來比較它們(比如根據比較結果生成每個條目爲0或1的結果向量)。如何使用SIMD比較兩個向量並獲得單個布爾結果?
然後,我想將結果向量與4個零的向量進行比較,並且只在它們相等時才執行某些操作。
你知道我可以用它來做什麼SIMD命令嗎?
要比較兩個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);
注意:假設
vector1
,vector2
,result
都需要16字節對齊{ -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);
謝謝。當我得到結果向量時,是否有一種簡單的方法來檢查它是否全爲零(我想要一個布爾值來表示它是否全爲零)。 –
我可以使用_mm_cmpgt_epi32,如果我想獲得更大的結果,對嗎? –
@ N.M:查看上面更新的答案。 –
哪些建築是你使用?所有SIMD都不同。 – Phonon
我對此非常非常新,所以請原諒我的無知。我正在嘗試使用英特爾Parallel Studio的平臺包含SIMD命令(這是否以任何方式回答您的問題?)。 –