दिलचस्प पोस्ट
आप आर आर कोड को कैसे कोडित करते हैं ताकि अन्य तर्कों में वेरिएबल्स के लिए 'डेटा' को देखने के लिए इसे 'जानता है'? जावा में स्ट्रिंग के पहले अक्षर को कैपिटल कैसे करें? आकार निर्दिष्ट किए बिना पूरे आईओएस एप के लिए कस्टम फॉन्ट कैसे सेट करें नोटपैड ++ इंडेंटेशन अप खराब करता है लोग base128 का उपयोग क्यों नहीं करते हैं? क्या सी ++ के नए ऑपरेशन द्वारा पते की रिटर्न के संरेखण की कोई गारंटी है? पीछे के विचारों के लिए UIGesture को अग्रेषित करना Postgres से MySQL को डाटाबेस माइग्रेट करें मैं एक सिंगलटन स्प्रिंग बीन को ApplicationContext से कैसे निकाल सकता हूं? एंड्रॉइड एक्लिप्स डीडीएमएस – फ़ाइलों को खींचने के लिए फोन पर डेटा / डेटा / एक्सेस नहीं किया जा सकता है सी ++ के पास कंस्ट्रक्टर क्यों नहीं है? JQuery छांटने वाली सूची और निश्चित / लॉक किए गए आइटम डिवी के अंदर की सीमा रखते हुए और इसके किनारे पर नहीं जावास्क्रिप्ट: कैसे इंटरनेट एक्सप्लोरर में परिवर्तन घटना अनुकरण (प्रतिनिधिमंडल) बाइनरी के लिए पायथन int?

एसएसई के साथ कुशल 4×4 मैट्रिक्स वेक्टर गुणन: क्षैतिज जोड़ और डॉट उत्पाद – क्या बात है?

मैं एसएसई का इस्तेमाल करते हुए एक वेक्टर (यू) के साथ 4×4 मैट्रिक्स (एम) गुणन के सबसे प्रभावी कार्यान्वयन का प्रयास कर रहा हूं। मेरा मतलब है म्यू = वी।

जहां तक ​​मैं समझता हूं कि इस बारे में जाने के दो प्राथमिक उपाय हैं:

method 1) v1 = dot(row1, u), v2 = dot(row2, u), v3 = dot(row3, u), v4 = dot(row4, u) method 2) v = u1 col1 + u2 col2 + u3 col3 + u4 col4. 

विधि 2 एसएसई 2 में लागू करना आसान है। विधि 1 या तो SSE3 में क्षैतिज जोड़ निर्देश या एसएसई 4 में डॉट उत्पाद निर्देश के साथ लागू किया जा सकता है। हालांकि, मेरे सभी परीक्षण विधि 2 में हमेशा विधि 1 को पीछे छोड़ दिया।

एक स्थान जहां मैं 1 विधि का लाभ 3×4 मैट्रिक्स में होगा, उदाहरण के लिए affine रूपांतरण के लिए। इस मामले में अंतिम डॉट उत्पाद अनावश्यक है। लेकिन इस मामले में भी विधि 4 एक 4×4 मैट्रिक्स पर 3×4 मैट्रिक्स पर विधि 1 की तुलना में तेज़ है। एकमात्र तरीका मैंने पाया है कि 4×4 मैट्रिक्स पर विधि 2 की तुलना में तेज़ है 4 x 3 मैट्रिक्स पर विधि 2 है।

तो क्षैतिज जोड़ और डॉट उत्पाद निर्देश का क्या मतलब है? वास्तव में डॉट प्रोडक्शन निर्देश इस मामले में सबसे खराब प्रदर्शन देता है। शायद यह डेटा के प्रारूप के साथ कुछ करना है? यदि मैट्रिक्स का आदेश दिया जाए तो कोई परिभाषित नहीं किया जा सकता है, तो एक स्थानांतर आवश्यक है और उस स्थिति में विधि 1 बेहतर होगा?

कुछ कोड के लिए नीचे देखें

 __m128 m4x4v_colSSE(const __m128 cols[4], const __m128 v) { __m128 u1 = _mm_shuffle_ps(v,v, _MM_SHUFFLE(0,0,0,0)); __m128 u2 = _mm_shuffle_ps(v,v, _MM_SHUFFLE(1,1,1,1)); __m128 u3 = _mm_shuffle_ps(v,v, _MM_SHUFFLE(2,2,2,2)); __m128 u4 = _mm_shuffle_ps(v,v, _MM_SHUFFLE(3,3,3,3)); __m128 prod1 = _mm_mul_ps(u1, cols[0]); __m128 prod2 = _mm_mul_ps(u2, cols[1]); __m128 prod3 = _mm_mul_ps(u3, cols[2]); __m128 prod4 = _mm_mul_ps(u4, cols[3]); return _mm_add_ps(_mm_add_ps(prod1, prod2), _mm_add_ps(prod3, prod4)); } __m128 m4x4v_rowSSE3(const __m128 rows[4], const __m128 v) { __m128 prod1 = _mm_mul_ps(rows[0], v); __m128 prod2 = _mm_mul_ps(rows[1], v); __m128 prod3 = _mm_mul_ps(rows[2], v); __m128 prod4 = _mm_mul_ps(rows[3], v); return _mm_hadd_ps(_mm_hadd_ps(prod1, prod2), _mm_hadd_ps(prod3, prod4)); } __m128 m4x4v_rowSSE4(const __m128 rows[4], const __m128 v) { __m128 prod1 = _mm_dp_ps (rows[0], v, 0xFF); __m128 prod2 = _mm_dp_ps (rows[1], v, 0xFF); __m128 prod3 = _mm_dp_ps (rows[2], v, 0xFF); __m128 prod4 = _mm_dp_ps (rows[3], v, 0xFF); return _mm_shuffle_ps(_mm_movelh_ps(prod1, prod2), _mm_movelh_ps(prod3, prod4), _MM_SHUFFLE(2, 0, 2, 0)); } 

Solutions Collecting From Web of "एसएसई के साथ कुशल 4×4 मैट्रिक्स वेक्टर गुणन: क्षैतिज जोड़ और डॉट उत्पाद – क्या बात है?"

क्षैतिज जोड़ और डॉट उत्पाद निर्देश जटिल होते हैं: इन्हें कई सरल माइक्रोऑपरेशनों में विघटित कर दिया जाता है, जो सरल निर्देशों की तरह प्रोसेसर द्वारा निष्पादित होते हैं। माइक्रोऑफ़रेड में क्षैतिज जोड़ और डॉट उत्पाद निर्देशों की सटीक अपघटन प्रोसेसर-विशिष्ट है, लेकिन हाल के इंटेल प्रोसेसर के लिए क्षैतिज जोड़ 2 शफफ़िल + 1 एड माइक्रोइपरेशन में विघटित हो गया है, और डॉट उत्पाद को 1 एमयूएल + 1 शूफेल + 2 एडीडी माइक्रोऑपरेशन में विघटित किया गया है। बड़ी संख्या में माइक्रोऑपरेशन के अलावा, यह निर्देश प्रोसेसर पाइपलाइन में निर्देश डिकोडर पर भी बल देता है: इंटेल प्रोसेसर प्रति चक्र में केवल एक ऐसे जटिल निर्देश को डीकोड कर सकता है (4 सरल निर्देशों की तुलना में)। एएमडी बुलडोजर पर इन जटिल निर्देशों की सापेक्ष लागत भी अधिक है।