簡體   English   中英

測試兩個__m128i變量之間的相等性

[英]Testing equality between two __m128i variables

如果我想在兩個__m128i變量之間進行逐__m128i測試,我是否需要使用SSE指令或者我可以使用== 如果沒有,我應該使用哪條SSE指令?

雖然使用_mm_movemask_epi8是一種解決方案,但如果你有一個帶SSE4.1的處理器,我認為更好的解決方案是使用一條指令來設置FLAGS寄存器中的零或進位標志。 這樣可以保存testcmp指令

要做到這一點,你可以這樣做:

if(_mm_test_all_ones(_mm_cmpeq_epi8(v1,v2))) {
    //v0 == v1
}

編輯:正如Paul R指出_mm_test_all_ones生成兩條指令: pcmpeqdptest 使用_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM