[英]Testing equality between two __m128i variables
如果我想在兩個__m128i
變量之間進行逐__m128i
測試,我是否需要使用SSE指令或者我可以使用==
? 如果沒有,我應該使用哪條SSE指令?
雖然使用_mm_movemask_epi8
是一種解決方案,但如果你有一個帶SSE4.1的處理器,我認為更好的解決方案是使用一條指令來設置FLAGS寄存器中的零或進位標志。 這樣可以保存test
或cmp
指令 。
要做到這一點,你可以這樣做:
if(_mm_test_all_ones(_mm_cmpeq_epi8(v1,v2))) {
//v0 == v1
}
編輯:正如Paul R指出_mm_test_all_ones
生成兩條指令: pcmpeqd
和ptest
。 使用_mm_cmpeq_epi8
,總共有三條指令。 這是一個更好的解決方案,總共只使用兩條指令:
__m128i neq = _mm_xor_si128(v1,v2);
if(_mm_test_all_zeros(neq,neq)) {
//v0 == v1
}
這會產生
pxor %xmm1, %xmm0
ptest %xmm0, %xmm0
您可以使用比較,然后從比較結果中提取掩碼:
__m128i vcmp = _mm_cmpeq_epi8(v0, v1); // PCMPEQB
uint16_t vmask = _mm_movemask_epi8(vcmp); // PMOVMSKB
if (vmask == 0xffff)
{
// v0 == v1
}
這適用於SSE2及更高版本。
正如@Zboson所指出的那樣,如果你有SSE 4.1那么你可以這樣做,這可能會稍微高效一點,因為它是兩個SSE指令,然后是對標志(ZF)的測試:
__m128i vcmp = _mm_xor_si128(v0, v1); // PXOR
if (_mm_testz_si128(vcmp, vcmp)) // PTEST (requires SSE 4.1)
{
// v0 == v1
}
我只是在Haswell Core i7上對這兩個實現進行基准測試,使用clang來編譯測試工具並且時序結果非常相似 - SSE4實現似乎稍微快一些,但很難衡量差異。
考慮使用SSE4.1指令ptest
:
if(_mm_testc_si128(v0, v1)) {if equal}
else {if not}
ptest
計算a和掩碼中128位(表示整數數據)的按位AND,如果結果為零則返回1,否則返回0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.