दो 64-बिट पूर्णांक को दो 64-बिट पूर्णांक से गुणा कैसे करें? मुझे कोई निर्देश नहीं मिला जो इसे कर सकता है।एसएसई गुणा 2 64-बिट पूर्णांक
उत्तर
आपको 32 बिट गुणा संचालन का उपयोग करके अपने 64 बिट गुणात्मक दिनचर्या को लागू करने की आवश्यकता होगी। यह शायद स्केलर कोड के साथ ऐसा करने से कहीं अधिक कुशल नहीं होगा, विशेष रूप से क्योंकि सभी आवश्यक संचालन प्राप्त करने के लिए वैक्टरों में बहुत सारे शफल होंगे।
मेरे सिर के शीर्ष से, क्या कोई 'pmuldqq' नहीं था या एसएसई 4 में कुछ जोड़ा गया था? – hirschhornsalz
एसएसई 4 में एक 'pmuldq' है जो 32x32 => 64 बिट गुणा है, इसलिए आप इसे 64x64 बिट गुणा करने के लिए बिल्डिंग ब्लॉक के रूप में उपयोग कर सकते हैं। –
क्या आप इस के लिए सबसे अच्छा स्केलर एल्गोरिदम जानते हैं (मानते हैं कि आपके पास केवल 32-बिट हार्डवेयर है)? क्या यही मुझे करना होगा। मैं प्रत्येक नंबर को अपने ऊपरी और निचले 32-बिट भाग में विभाजित करता हूं और फिर (ए * बी) = (अल + एएच) * (बीएल * बीएच) = टी 1 + टी 2 + टी 3 + टी 4 जहां टी 1 = एल * बीएल, टी 2 = अल * बीएच, टी 3 = आह * बीएल टी 4 = आह * बीएच। प्रत्येक शब्द 64-बिट संख्या होगी। फिर टी 2 और टी 3 को फिर से कम और उच्च में विभाजित करना होगा और अंतिम संख्या (ए * बी) एल = टी 1 + टी 2 एल + टी 3 एल, (ए * बी) एच = टी 4 + टी 2 एच + टी 3 एच + सी, जहां सी किसी भी वाहक (ए * बी) एल है। यह 4 mults है, और 7 जोड़ता है। क्या यह कहीं SO पर है? –
मुझे पता है कि यह एक पुराना सवाल है लेकिन मैं वास्तव में वास्तव में इसकी तलाश कर रहा था। चूंकि अभी भी इसके लिए कोई निर्देश नहीं है, मैंने पॉल बिट का उल्लेख करते हुए 64 बिट को pmuldq के साथ गुणा कर दिया। यह मैं
__m128i Multiply64Bit(__m128i a, __m128i b)
{
auto ax0_ax1_ay0_ay1 = a;
auto bx0_bx1_by0_by1 = b;
// i means ignored
auto ax1_i_ay1_i = _mm_shuffle_epi32(ax0_ax1_ay0_ay1, _MM_SHUFFLE(3, 3, 1, 1));
auto bx1_i_by1_i = _mm_shuffle_epi32(bx0_bx1_by0_by1, _MM_SHUFFLE(3, 3, 1, 1));
auto ax0bx0_ay0by0 = _mm_mul_epi32(ax0_ax1_ay0_ay1, bx0_bx1_by0_by1);
auto ax0bx1_ay0by1 = _mm_mul_epi32(ax0_ax1_ay0_ay1, bx1_i_by1_i);
auto ax1bx0_ay1by0 = _mm_mul_epi32(ax1_i_ay1_i, bx0_bx1_by0_by1);
auto ax0bx1_ay0by1_32 = _mm_slli_epi64(ax0bx1_ay0by1, 32);
auto ax1bx0_ay1by0_32 = _mm_slli_epi64(ax1bx0_ay1by0, 32);
return _mm_add_epi64(ax0bx0_ay0by0, _mm_add_epi64(ax0bx1_ay0by1_32, ax1bx0_ay1by0_32));
}
क्या आपने इस के लिए सामान्य प्रयोजन रजिस्टरों का उपयोग कर कोड बनाम किसी भी बेंचमार्किंग की है? मुझे परिणामों में दिलचस्पी होगी क्योंकि मैं 64 बिट गुणों से 64 का टन कर रहा हूं। – jeteon
मैंने अभी कुछ बेंचमार्किंग किया है, यह अभी भी स्केलर गुणा (क्लाउड/ओ 2 के साथ संकलित) से तेज है। औसत में लगभग 831600000 गुणा। मेरे कुछ हद तक शक्तिशाली i7 5820k पर 0.37 सेकेंड। इस बीच उसी स्केलर गुणाओं ने औसत पर 1.71 लिया। तो यह लगभग 4 गुना तेजी से है, जो थोड़ा अजीब है। मुझे लगता है कि सीएल सुपरस्कायर निर्देशों को अनुकूलित करने में वाकई अच्छा है – JukesOnYou
- 1. एसएसई गुणा 4 32-बिट पूर्णांक
- 2. एसएसई गुणा 16 x uint8_t
- 3. एसएसई पूर्णांक विभाजन?
- 4. हस्ताक्षरित और हस्ताक्षरित पूर्णांक गुणा
- 5. एसएसई निकालने के लिए केवल एसएसई 2
- 6. आर: सरल गुणा पूर्णांक ओवरफ्लो
- 7. एसएसई
- 8. पूर्णांक C++ में गुणा कैसे करते हैं?
- 9. पूर्णांक द्वारा चार गुणा करें (सी ++)
- 10. बहुत बड़े पूर्णांक का तेज़ गुणा
- 11. पूर्णांक द्वारा अवधि को गुणा कैसे करें?
- 12. तर्कसंगत से गुणा पूर्णांक मध्यवर्ती अतिप्रवाह
- 13. पूर्णांक गुणा, अतिप्रवाह, और सूचना हानि
- 14. गुणा
- 15. क्यों 2 डी सरणी गुणा
- 16. एसएसई 2 इंट्रिनिक्स और जीसीसी इनलाइन असेंबलर
- 17. विजुअल स्टूडियो 6 प्रोसेसर पैक एसएसई 2
- 18. डॉट उत्पाद - एसएसई 2 बनाम बीएलएएस
- 19. एसएसई
- 20. एसएसई
- 21. इस गुणा में एक पूर्णांक ओवरफ़्लो क्यों है?
- 22. बिटवाई ऑपरेटरों का उपयोग करके दो पूर्णांक का गुणा
- 23. एसएसई के साथ कुशल 4x4 मैट्रिक्स वेक्टर गुणा: क्षैतिज जोड़ और डॉट उत्पाद - बिंदु क्या है?
- 24. फास्ट गुणा मॉड्यूलो 2^16 + 1
- 25. एसएसई रजिस्टर
- 26. एसएसई निर्देशों का उपयोग
- 27. एसएसई 4
- 28. पूर्णांक गुणा में ओवरफ्लो से बचने के बाद विभाजन
- 29. Schönhage-Strassen एल्गोरिदम (विशाल पूर्णांक गुणा) को समझना
- 30. एसएसई से लंबे समय तक पूर्णांक दिनचर्या लाभ हो सकता है?
इस संदर्भ में "दो 64 बिट पूर्णांक" का क्या अर्थ है? क्या आपका मतलब 64 बिट पूर्णांक (एक ला जटिल संख्या) की एक जोड़ी है, या एक 128 बिट पूर्णांक 64 बिट पूर्णांक की एक जोड़ी के रूप में दर्शाया गया है? –
मेरा मतलब है कि एक बिट एम 128i बिट इंटीजर 64 बिट पूर्णांक की एक जोड़ी के रूप में दर्शाया गया है –
[इस प्रश्न] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/12200698/is-it-possible-to-use-sse-v2 -to-make-a-128-bit-wide-integer), फिर। –