簡體   English   中英

在__m128i向量上水平檢查零?

[英]Check for zeros horizontally across __m128i vector?

我有幾個包含32位無符號整數的__m128i向量,我想檢查4個整數是否為零。

我了解如何“聚合”多個__m128i向量,但最終我仍然會得到一個__m128i向量,然后需要水平檢查。

如何在最后一個向量上執行零的最終水平檢查?

編輯我正在使用英特爾內部函數,而不是內聯匯編

不要這樣 盡可能避免水平操作; 矢量代碼的性能大受打擊。

取而代之的是,將向量與零向量進行比較,然后使用PMOVMSKB獲取GPR中的掩碼。 如果該掩碼不為零,則向量的至少一個泳道為零:

__m128i yourVector;
__m128i zeroVector = _mm_set1_epi32(0);

if (_mm_movemask_epi8(_mm_cmpeq_epi32(yourVector,zeroVector))) {
    // at least one lane of your vector is zero.
}

如果您想使用SSE4.1,也可以使用PTEST。


以面值來考慮問題,如果您確實確實需要進行水平處理,並且由於某種原因,那就是movhlps + andps + shufps + andps。 但是不要那樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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