2013-02-18 57 views
5

86/SIMD विधानसभा में, मैं एक ग्राफिक छवि मैं बदलने की आवश्यकता के चार 32 बिट पिक्सल के साथ एक XMM रजिस्टर आबादी है। हालांकि, पिक्सल 10 बिट पैक आरजीबी प्रारूप में हैं, इसलिए वे इस रूप में 32 बिट में मौजूद है:किसी अन्य के द्वारा एक XMM रजिस्टर गुणा करने की आवश्यकता है, लेकिन थोड़ा नकाबपोश मूल्य के साथ

[ red ][ green ][ blue ][] 
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00 

पिछले दो बिट्स गद्दी बिट्स कर रहे हैं और अप्रयुक्त हैं।

मैं एक और मूल्य से इन पिक्सल गुणा करने की आवश्यकता है, लेकिन मूल्य, यह केवल कहते हैं कि प्रभावित करता है इसलिए नकाबपोश किए जाने की आवश्यकता लाल पिक्सेल। यह मान निरंतर है, इसलिए इसे हार्ड-कोड किया जा सकता है। मान लें कि मान 0.1234 है। मैं इसे उचित मास्किंग के साथ एक और एक्सएमएम रजिस्टर में कैसे रखूंगा ताकि यह प्रत्येक 32 बिट सेगमेंट के लाल हिस्से को प्रभावित कर सके?

रेखांकन इलस्ट्रेटेड, मैं कुछ इस तरह करना चाहते हैं:

XMM0 (first 32 bit segment): 
[ 0.1234 ][ 1.0 ][ 1.0 ][] 

* 

XMM1 (first 32 bit segment): 
RRRRRRRRRRGGGGGGGGGGBBBBBBBBBB00 
परिणाम XMM0 और XMM1 के उत्पाद जा रहा है

। बेशक, इस 32 बिट सेगमेंट को पूरे एक्सएमएम रजिस्टर में डुप्लिकेट किया जाएगा, मैंने अभी पहले 32 बिट्स निर्दिष्ट किए हैं ताकि आपको विचार मिल सके।

उत्तर

3

यदि आप वास्तव में केवल लाल हिस्से को प्रभावित करना चाहते हैं तो आप एक चाल के साथ आने में सक्षम हो सकते हैं जो कुछ स्थिरता से हरे रंग के लाल और हिस्से को गुणा करेगा (रजिस्टर को 16-बिट शॉर्ट्स के संग्रह के रूप में मानना) और उसके बाद पुराने हरे और नीले रंग के साथ केवल नए लाल हिस्से को पुन: संयोजित करते हैं।

यदि आप सभी रंगों पर काम करने जा रहे हैं तो बेहतर रणनीति है कि उस प्रारूप को एक समर्थित xmm रजिस्टर प्रारूप (जैसे 16- या 32-बिट शॉर्ट या फ्लोट) में शिफ्ट और शफल के संयोजन का उपयोग करके अनपैक करना है (और संभवतः फ्लोट में परिवर्तित) संचालन। फिर अपने सभी गणित करें, फिर इसे वापस पैक करें।

आप कभी भी किसी भी मूल्यों को फिर से उपयोग कर रहे हैं (उदाहरण के लिए, आप एक फ़िल्टर गिरी कंप्यूटिंग कर रहे हैं) और आप नाव में काम कर रहे हैं, यह बहुत तेजी से अगर आप खोल हो सकता है और एक बार और फिर फ्लोट करने के लिए परिवर्तित कर देंगे उस मान को फिर से उपयोग करें। भले ही आपको एक लूप बनाना है जो उस पर परिचालन करने से पहले पूरी पंक्ति को 32-बिट फ्लोट पर अनपैक करता है और पूरी पंक्ति को फिर से पैक करता है।

+0

घसीटना, अच्छा नहीं है। हालांकि मैं बाकी के बारे में सहमत हूं, एक शिफ्ट-और-गुणा-शिफ्ट-या (और) चीज करना शायद सबसे अच्छा तरीका है (यदि कोई अच्छा तरीका है)। – Damon

+0

@ डैमन: मेरा मतलब था कि सभी आर, जी और बी बिट्स (स्थानांतरित, अन्य बिट्स से घिरे हुए) को 16- या 32-बिट संरेखण में प्राप्त करने के लिए पहले पास के रूप में 'पीएसएचयूएफबी' का मतलब था, फिर मास्किंग और स्थानांतरण का उपयोग करना । आप जो करने जा रहे हैं उसके आधार पर आप 'पीएसएचयूएफबी' के रूप में वर्णन कर सकते हैं, 'पांडा' को असंबंधित बिट्स को मास्क करने के लिए, और फिर सीधे 'सीवीटीपीआईपीएस'। शिफ्ट के कारण, कुछ मूल्यों को स्थानांतरित किया जाएगा (उदाहरण के लिए लाल हमेशा नीचे हरे रंग के 6 बिट होते हैं, मास्क किए जाते हैं, इसलिए यह 64.0 * आर) है लेकिन आप गुणा में रूपांतरण को सेंक कर सकते हैं (यानी '0.1234/64.0') ** या ** इसे फिर से पैकिंग के लिए इस तरह से स्केल कर दें। –

+0

आह मैं देखता हूं।यद्यपि यह संभवत: ऐसा कुछ नहीं है जो मैं करता हूं क्योंकि यह एसएसएसई 3 पर निर्भरता बनाता है, जो कि अच्छी तरह से समर्थित नहीं है, कुछ ऐसा करने के लिए जो एक साधारण शिफ्ट शायद ही करता है (अगर मुझे सही समझा जाता है, तो ओपी केवल एक चैनल चाहता है, इसलिए यह आर के मामले में 22 द्वारा शिफ्ट, छोटा होना चाहिए)। दूसरी तरफ, यदि कोई तीनों चैनल चाहता है, तो 'पीएसएचआईएफबी' जाकर एक बड़ा फायदा हो सकता है। – Damon

2

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

आप यह भी पा सकते हैं कि चार आर, चार जी, और चार बी मान तैयार करना वास्तव में आसान है, और उसके बाद एक मान बनाएं जिसमें एक अन्य एक्सएमएम रजिस्टर में रंग मानों के लिए समान गुणक हो, और उसमें गुणा करें आर, जी और बी को एक रजिस्टर में रखने के बजाए। जाहिर है, इसे लूप के कुछ अनलॉकिंग की आवश्यकता होगी, लेकिन यह वैसे भी प्रदर्शन को बेहतर बनाने में मदद करता है। के बाद से आरजीबी मूल्यों एक XMM रजिस्टर के एक भी 32-बिट coponent में पैक कर रहे हैं

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^