2011-07-03 6 views
7

के साथ लगातार फ्लोट्स मैं माइक्रोसॉफ्ट के एसएसई इंट्रिनिक्स का उपयोग कर कुछ कोड को अनुकूलित करने के लिए अपना हाथ आजमा रहा हूं। मेरे कोड को अनुकूलित करते समय सबसे बड़ी समस्याओं में से एक एलएचएस होता है जब भी मैं निरंतर उपयोग करना चाहता हूं। कुछ स्थिरांक (here और here - section 13.4) उत्पन्न करने पर कुछ जानकारी प्रतीत होती है, लेकिन इसकी सभी असेंबली (जो मैं इससे बचूंगा)।सिमड

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

उदाहरण - उत्पन्न {1.0,1.0,1.0,1.0}

//pcmpeqw xmm0,xmm0 
__m128 t = _mm_cmpeq_epi16(t, t); 

//pslld xmm0,25 
_mm_slli_epi32(t, 25); 

//psrld xmm0,2 
return _mm_srli_epi32(t, 2); 

यह असंगत प्रकार (__m128 _m128i बनाम) के बारे में त्रुटियों की एक गुच्छा उत्पन्न करता है। मैं इसके लिए बहुत नया हूं, इसलिए मुझे पूरा यकीन है कि मुझे कुछ स्पष्ट याद आ रहा है। क्या कोई मदद कर सकता है?

tldr - मैं एमएस इंट्रिनिक्स के साथ एकल परिशुद्धता निरंतर फ्लोट से भरा __m128 vec कैसे उत्पन्न करूं?

पढ़ने के लिए धन्यवाद :)

+0

आपको क्या लगता है कि आपको ऐसा करने की आवश्यकता है? आमतौर पर स्थिरांक एक कम्प्यूटेशनल लूप से पहले केवल एक बार लोड होते हैं, इसलिए स्मृति पहुंच की सापेक्ष लागत नगण्य है। –

+0

मेरे पास कई स्थिरांक हैं, जिनमें से सभी एक लूप के भीतर उपयोग किए जाते हैं जो दुर्भाग्य से पहले से ही सभी 8 एक्सएमएम रजिस्टरों का उपयोग करने लगता है। Vtune के भीतर मुझे उस बिंदु पर एक बहुत ही उच्च सीपीआई मिलता है जिस पर इनमें से कुछ स्थिरांक का उपयोग किया जाता है। मुझे लगता है कि अगर मैं उन स्थिरांकों की संख्या को कम कर सकता हूं जो मैं एक्सेस कर रहा हूं, और इसके बजाय कुछ उत्पन्न कर सकता हूं, जो लागत को कम कर सकता है क्योंकि कोई दूसरे की लागत को छुपाएगा। इसके अलावा, अजीब बात यह है कि, स्थिरांक में से किसी एक पर रजिस्टर कीवर्ड का उपयोग करके थोड़ा सा मदद मिली (भले ही इसके परिणामस्वरूप कुछ अन्य मूल्यों को इसके बजाय xmm regs से बाहर धकेल दिया गया हो)। – JBeFat

+4

यदि आप कर सकते हैं तो x86-64 का उपयोग करें - इस तरह आपको 16 एक्सएमएम रजिस्ट्रार मिलते हैं। यह भी ध्यान रखें कि भले ही आपको एक या अधिक कैश मिल जाए, पहली बार इन स्थिरांकों को लोड किया जाता है, इसे बड़ी संख्या में पुनरावृत्तियों पर मिश्रित किया जाना चाहिए जहां स्थिरांक बाद में एल 1 कैश में होंगे। (बेशक आपके पास केवल थोड़ी सी लूप पुनरावृत्तियों की संख्या है?) –

उत्तर

3

_mm_castsi128_ps का उपयोग करके __m128i को __m128 पर डालें। इसके अलावा, दूसरी पंक्ति

t = _mm_slli_epi32(t, 25) 
+0

धन्यवाद! मुझे लगा कि यह ऐसा कुछ आसान होगा। – JBeFat

4

_mm_set_ps, _mm_set_ps1 या _mm_set1_ps की कोशिश करो।

+0

'0x1a11 movaps xmm6, xmmword ptr [0x414890]' ' 0x1a18 xorps xmm5, xmm5' हाय, समय :) जवाब देने के लिए आप (गलत तरीके से प्रारूपित, खेद) से देख सकते हैं लेने के लिए धन्यवाद __mm_set_ps से ऊपर की सूची वास्तव में मेरी मदद नहीं करती है क्योंकि यह अभी भी स्मृति में कहीं से स्थिरांक लोड करने के लिए movaps का उपयोग करती है। मैं चाहता हूं कि xmm रजिस्टरों के भीतर सीधे स्थिरांक उत्पन्न करने के लिए मौजूदा विधियों का उपयोग करना है। – JBeFat

+0

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

+1

यह भी ध्यान दें कि '__mm_set_ps' के साथ कोई एलएचएस स्टोर नहीं है, क्योंकि एफपीयू शामिल नहीं है। –

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