सी

2009-12-22 15 views
5

में एसएसई/एसएसई 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 आदि आदि ... वहाँ कोई समग्र प्रदर्शन लाभ है, क्योंकि सभी की उथल सामान चारों ओर इतना समय तक ले जाता है!

क्या किसी के पास कोई सुझाव है कि मैं इन बाइट पिक्सेल मूल्यों को एसएसई रजिस्टरों में तेज़ी से और कुशलतापूर्वक कैसे लोड कर सकता हूं ताकि मुझे वास्तव में उन पर परिचालन करने से प्रदर्शन लाभ प्राप्त हो सके?

+2

क्या आपको फ़्लोटिंग-पॉइंट ऑपरेशंस करने की आवश्यकता है? एमएमएक्स भी है, जो पूर्णांक प्रकारों पर काम करता है। वास्तव में –

+0

। यदि आप पूर्णांक प्रकारों पर काम कर रहे हैं, तो आपको फ़्लोटिंग-पॉइंट वाले के बजाय अभिन्न सिम निर्देशों का उपयोग करना चाहिए। –

+0

मुझे कुछ भी फ़्लोटिंग पॉइंट करने की आवश्यकता नहीं है, इसलिए आप सही हैं, एमएमएक्स पूर्णांक निर्देश पूरी तरह से पर्याप्त हैं। –

उत्तर

1

आप MMX उपयोग करने के लिए तैयार हैं, तो ...

MMX आप 64 बिट रजिस्टरों कि प्रत्येक के रूप में 8, 8-बिट मूल्यों रजिस्टर इलाज कर सकते हैं की एक गुच्छा देता है।

8-बिट मानों की तरह आप काम कर रहे हैं।

एक अच्छा प्राइमर here है।

+1

जो वास्तव में सबसे अच्छा सुझाव नहीं है क्योंकि एमएमएक्स अप्रचलित हो रहा है और एसएसई 2 है जो लगभग एमएमएक्स जितना तेज़ प्रदर्शन करता है –

0

सबसे पहले, जिस डेटा से आप प्रतिलिपि बना रहे हैं (मुझे लगता है कि यह void* पॉइंटर द्वारा इंगित किया गया है) इष्टतम प्रदर्शन के लिए गठबंधन किया जाना चाहिए - अगर इसे स्मृति गठबंधन बफर में कॉपी न करें।

दूसरे, आप अभी भी SSE2 उपयोग कर सकते हैं एक बार आप एक स्मृति गठबंधन बफर में अपना डेटा स्थानांतरित करने, यह काफी आसान है - मैं intrinsics साथ किसी भी मुद्दे के बिना code here इस्तेमाल किया (लेकिन विधानसभा के रूप में विस्तृत here के साथ समस्याओं था)।

आशा है कि यह उपयोगी है - मैंने भी छवियों के साथ काम किया और उन्हें मुख्य स्मृति में unsigned char के रूप में संग्रहीत किया और उन्हें एसएसई 2 रजिस्टरों (आर, जी, या बी से 0-255 से अलग किया गया) के रूप में कॉपी किया - लेकिन मैंने उपयोग किया असेंबली कोड क्योंकि मुझे लगा कि यह आसान था।

लेकिन यदि आप इसे क्रॉस-प्लेटफॉर्म बनाना चाहते हैं, तो मुझे लगता है कि इंट्रिनिक्स का उपयोग क्लीनर होगा।

शुभकामनाएं!

1

मुझे लगता है कि आपकी प्रदर्शन की बाधा कास्टिंग से फ्लोट तक आ सकती है, यह एक महंगी ऑपरेशन है।

यदि मुझे अच्छी तरह याद है, तो अधिकांश कास्टिंग में कास्टिंग लगभग 50 घड़ी चक्र है ...और सबसे बुरी स्थिति पर विचार करते हुए जिसमें एफपी गुणात्मकताएं हो सकती हैं, मान लीजिए, लगभग 4 घड़ियों प्रत्येक पाइपलाइन में ओवरलैपिंग के बिना, उनमें से सभी को 1 चक्र में समानांतर में करने से आप 15 चक्रों को अधिक से अधिक बचा सकते हैं, फिर भी कोई लाभ नहीं।

मैं निश्चित रूप से उसी नंबर प्रारूप (इस मामले में पूर्णांक) के साथ हमेशा काम करने के लिए जाता हूं, यदि श्मोप्टी जैसे एमएमएक्स के साथ स्ट्रीम किया गया तो बेहतर होता है।