में एसएसई/एसएसई 2 इंट्रिनिक्स के साथ बाइट पिक्सेल प्रोसेसिंग मैं क्रॉस-प्लेटफॉर्म सी के लिए प्रोग्रामिंग कर रहा हूं, वेबकैम छवियों के लिए विभिन्न चीजें करने के लिए एक पुस्तकालय। सभी परिचालन प्रति-पिक्सेल और अत्यधिक समांतर होते हैं - उदाहरण के लिए बिट मास्क लागू करना, स्थिरांक द्वारा रंग मानों को गुणा करना आदि। इसलिए मुझे लगता है कि मैं एसएसई/एसएसई 2 इंट्रिनिक्स का उपयोग कर प्रदर्शन प्राप्त कर सकता हूं।सी
हालांकि, मुझे डेटा प्रारूप समस्या है। मेरी वेबकैम लाइब्रेरी मुझे वेबकैम फ्रेम को पॉइंटर (शून्य *) के रूप में एक बफर में 24- या 32-बिट बाइट पिक्सल युक्त एबीजीआर या बीजीआर प्रारूप में देती है। मैं इन्हें char * पर कास्टिंग कर रहा हूं ताकि पीआरटी ++ आदि सही तरीके से व्यवहार कर सकें। हालांकि, सभी एसएसई/एसएसई 2 संचालन __m128 या __m64 डेटा प्रकारों में या तो चार पूर्णांक या चार फ्लोट की अपेक्षा करते हैं। अगर मैं ऐसा करता हूं (मान लीजिए कि मैंने बफर से रंग आर, जी, और बी में रंग मान पढ़े हैं):
फ्लोट पिक्सेल [] = {(फ्लोट) आर, (फ्लोट) जी, {फ्लोट) बी, 0.0f};
फिर एक और नाव स्थिरांक
नाव स्थिरांक [] = {0.299, 0.587, 0.114, 0.0f} से भरा सरणी लोड;
डाली दोनों नाव संकेत __m128, और __mm_mul_ps आर * 0.299, छ करने के लिए आंतरिक उपयोग करने के लिए * 0.587 आदि आदि ... वहाँ कोई समग्र प्रदर्शन लाभ है, क्योंकि सभी की उथल सामान चारों ओर इतना समय तक ले जाता है!
क्या किसी के पास कोई सुझाव है कि मैं इन बाइट पिक्सेल मूल्यों को एसएसई रजिस्टरों में तेज़ी से और कुशलतापूर्वक कैसे लोड कर सकता हूं ताकि मुझे वास्तव में उन पर परिचालन करने से प्रदर्शन लाभ प्राप्त हो सके?
क्या आपको फ़्लोटिंग-पॉइंट ऑपरेशंस करने की आवश्यकता है? एमएमएक्स भी है, जो पूर्णांक प्रकारों पर काम करता है। वास्तव में –
। यदि आप पूर्णांक प्रकारों पर काम कर रहे हैं, तो आपको फ़्लोटिंग-पॉइंट वाले के बजाय अभिन्न सिम निर्देशों का उपयोग करना चाहिए। –
मुझे कुछ भी फ़्लोटिंग पॉइंट करने की आवश्यकता नहीं है, इसलिए आप सही हैं, एमएमएक्स पूर्णांक निर्देश पूरी तरह से पर्याप्त हैं। –