चार 32-बिट पूर्णांक को 4 अन्य पूर्णांक से गुणा कैसे करें? मुझे कोई निर्देश नहीं मिला जो इसे कर सकता है।एसएसई गुणा 4 32-बिट पूर्णांक
उत्तर
आप की जरूरत है पर हस्ताक्षर किए 32x32 बिट पूर्णांक गुणन तो software.intel.com पर निम्न उदाहरण की तरह यह क्या करना चाहिए लगता है कि आप क्या चाहते हैं:
static inline __m128i muly(const __m128i &a, const __m128i &b)
{
__m128i tmp1 = _mm_mul_epu32(a,b); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32(_mm_srli_si128(a,4), _mm_srli_si128(b,4)); /* mul 3,1 */
return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0))); /* shuffle results to [63..0] and pack */
}
आप दो के लिए चाहते हो सकता है बनाता है - पुराने CPU और एक के लिए एक हाल के सीपीयू के लिए, इस मामले में आप निम्न कार्य कर सकते हैं:
static inline __m128i muly(const __m128i &a, const __m128i &b)
{
#ifdef __SSE4_1__ // modern CPU - use SSE 4.1
return _mm_mullo_epi32(a, b);
#else // old CPU - use SSE 2
__m128i tmp1 = _mm_mul_epu32(a,b); /* mul 2,0*/
__m128i tmp2 = _mm_mul_epu32(_mm_srli_si128(a,4), _mm_srli_si128(b,4)); /* mul 3,1 */
return _mm_unpacklo_epi32(_mm_shuffle_epi32(tmp1, _MM_SHUFFLE (0,0,2,0)), _mm_shuffle_epi32(tmp2, _MM_SHUFFLE (0,0,2,0))); /* shuffle results to [63..0] and pack */
#endif
}
PMULLD, एसएसई 4.1 से, ऐसा करता है।
विवरण थोड़ा भ्रामक है, यह हस्ताक्षरित गुणा के बारे में बात करता है, लेकिन चूंकि यह केवल 32 बिट्स को स्टोर करता है, यह वास्तव में एक साइन-अनजान निर्देश है जिसका उपयोग आप IMUL
दोनों के लिए कर सकते हैं।
धन्यवाद। लेकिन क्या केवल एसएसई 2 निर्देशों का उपयोग करने का कोई तरीका है? – Yury
'_mm_mullo_epi32' यदि आप कच्चे असेंबली –
@Leviathan हां से इंट्रिनिक्स का उपयोग करना चाहते हैं, लेकिन आपको कई निर्देशों की आवश्यकता है। आर्किटेक्चर के आधार पर, चार 'imul' संभवतः तेज़ और सरल – hirschhornsalz
- 1. एसएसई गुणा 16 x uint8_t
- 2. एसएसई 4
- 3. फोरट्रान: पूर्णांक * 4 बनाम पूर्णांक (4) बनाम पूर्णांक (प्रकार = 4)
- 4. एसएसई
- 5. पूर्णांक द्वारा चार गुणा करें (सी ++)
- 6. बहुत बड़े पूर्णांक का तेज़ गुणा
- 7. पूर्णांक C++ में गुणा कैसे करते हैं?
- 8. पूर्णांक गुणा, अतिप्रवाह, और सूचना हानि
- 9. एसएसई निकालने के लिए केवल एसएसई 2
- 10. एसएसई
- 11. एसएसई
- 12. एसएसई इंट्रिनिक्स
- 13. एसएसई रजिस्टर
- 14. एसएसई के साथ कुशल 4x4 मैट्रिक्स वेक्टर गुणा: क्षैतिज जोड़ और डॉट उत्पाद - बिंदु क्या है?
- 15. जीसीसी एसएसई कोड अनुकूलन
- 16. एसएसई निर्देशों का उपयोग
- 17. पूर्णांक गुणा में ओवरफ्लो से बचने के बाद विभाजन
- 18. बिटवाई ऑपरेटरों का उपयोग करके दो पूर्णांक का गुणा
- 19. Schönhage-Strassen एल्गोरिदम (विशाल पूर्णांक गुणा) को समझना
- 20. एसएसई से लंबे समय तक पूर्णांक दिनचर्या लाभ हो सकता है?
- 21. गुणा
- 22. गुणा
- 23. एसएसई बिलीनेर इंटरपोलेशन
- 24. क्या एसएसई
- 25. सी sizeof पूर्णांक सरणी हमेशा 4
- 26. मैट्रिक्स गुणा
- 27. मॉड्यूलो गुणा (सी में)
- 28. एसएसई माइक्रो-ऑप्टिमाइज़ेशन निर्देश ऑर्डर
- 29. गुणा 0 अनुकूलन द्वारा
- 30. एसएसई असहज त्रुटि: SECURITY_ERR: सर्वर प्रेषित ईवेंट (एसएसई)
अच्छा जवाब। मजेदार आपने बिल्कुल वही टाइपो बनाया जो मेरे कोड में एक बार था: यह _____SSE4_1_____ होना चाहिए (ई और 4 के बीच कोई अंडरस्कोर नहीं)। परेशान, क्योंकि आप इसे आसानी से नहीं देखते हैं - जब तक वैकल्पिक कोड पथ ठीक है, तब तक प्रोग्राम सही होता है – hirschhornsalz
@drhirsch: इसे ठीक करने के लिए धन्यवाद - वास्तविक कोड में मैं '__MNI__',' __SNI__', आदि का उपयोग करता हूं - मुख्य रूप से ऐतिहासिक कारणों से, लेकिन यह ऊपर की तरह सरल त्रुटियों के लिए भी कम प्रवण है। –
बहुत बढ़िया, धन्यवाद! अब, अगर केवल एसएसई 2 के साथ एक सीपीयू पर '_mm_insert_epi32' को बदलने के लिए एक समान चाल थी ... –