c - प्रत्येक तत्व का संकेत निकालने के लिए एसएसई आंतरिक 16[8] से अधिक आंतरिक है




x86 sse (2)

आप वांछित परिणाम प्राप्त करने के लिए न्यूनतम / अधिकतम संचालन का उपयोग कर सकते हैं, उदा

inline __m128i _mm_sgn_epi16(__m128i v)
{
    v = _mm_min_epi16(v, _mm_set1_epi16(1));
    v = _mm_max_epi16(v, _mm_set1_epi16(-1));
    return v;
}

यह संभवतः शून्य + स्थानांतरण के साथ स्पष्ट रूप से तुलना की तुलना में थोड़ा और अधिक कुशल है। परिणाम संयोजन।

ध्यान दें कि पहले से ही _mm_sign_epi16 में एक _mm_sign_epi16 आंतरिक ( PSIGNW - PSIGNW देखें) है, जो कुछ भिन्न रूप से व्यवहार करता है, इसलिए मैंने _mm_sgn_epi16 को आवश्यक फ़ंक्शन के लिए नाम बदल दिया। जब SSSE3 उपलब्ध है, तो _mm_sign_epi16 का उपयोग करना अधिक कुशल हो सकता है, इसलिए आप ऐसा कुछ कर सकते हैं:

inline __m128i _mm_sgn_epi16(__m128i v)
{
#ifdef __SSSE3__
    v = _mm_sign_epi16(_mm_set1_epi16(1), v); // use PSIGNW on SSSE3 and later
#else
    v = _mm_min_epi16(v, _mm_set1_epi16(1));  // use PMINSW/PMAXSW on SSE2/SSE3.
    v = _mm_max_epi16(v, _mm_set1_epi16(-1));
#endif
    return v;
}

https://code.i-harness.com

मैं एसएसई आंतरिक कार्यों के साथ काम कर रहा हूँ मेरे पास 8 हस्ताक्षरित लघु (16 बिट) मानों की एक सरणी का प्रतिनिधित्व करते हुए एक __m128i है।

क्या प्रत्येक तत्व का संकेत प्राप्त करने के लिए कोई फ़ंक्शन है?

EDIT1: कुछ ऐसा प्रयोग किया जा सकता है:

short tmpVec[8];
__m128i tmp, sgn;

for (i-0;i<8;i++)
    tmp.m128i_i16[i] = tmpVec[i]

sgn = _mm_sign_epi16(tmp);

बेशक "_mm_sign_epi16" मौजूद नहीं है, इसलिए मैं इसके लिए देख रहा हूं।

यह तत्व द्वारा तत्व को कितना धीमा करना है?

EDIT2: वांछित व्यवहार: सकारात्मक मानों के लिए 1, शून्य के लिए 0, और नकारात्मक मानों के लिए -1।

धन्यवाद


आप सभी 8 शॉर्ट्स को एक बार _mm_srai_epi16(tmp, 15) का उपयोग करते हुए _mm_srai_epi16(tmp, 15) जो आठ से 16-बिट पूर्णांक लौटाएंगे, प्रत्येक के सभी (यानी -1) के साथ यदि इनपुट नकारात्मक था, या सभी शून्य (यानी 0) यदि सकारात्मक होगा





sign