2011-05-01 22 views
5

मैं एवीएक्स इंट्रिनिक्स का उपयोग कर वीसी ++ में फीड फॉरवर्ड नेट लिख रहा हूं। मैं इस कोड को PInvoke के माध्यम से सी # में आमंत्रित कर रहा हूं। फंक्शन एक्सप() सहित एक बड़े लूप की गणना करने वाले फ़ंक्शन को कॉल करते समय मेरा प्रदर्शन 160 एम के लूपइज़ के लिए ~ 1000ms है। जैसे ही मैं किसी भी फ़ंक्शन को एवीएक्स इंट्रिनिक्स का उपयोग करता हूं, और उसके बाद बाद में एक्स() का उपयोग करता हूं, मेरा प्रदर्शन उसी ऑपरेशन के लिए ~ 8000ms तक गिर जाता है। ध्यान दें कि एक्स() की गणना करने वाला फ़ंक्शन मानक सी है, और AVX इंट्रिनिक्स का उपयोग करने वाला कॉल संसाधित किए जा रहे डेटा के संदर्भ में पूरी तरह से असंबंधित हो सकता है। कुछ प्रकार का ध्वज रनटाइम पर कहीं भी जा रहा है।एवीएक्स निर्देशों का उपयोग एक्स() अनुकूलन अक्षम करता है?

दूसरे शब्दों में,

A(); // 1000ms calculates 160M exp() 
B(); // completely unrelated but contains AVX 
A(); // 8000ms 

या, दिलचस्प,

C(); // contains 128 bit SSE SIMD expressions 
A(); // 1000ms 

मैं के रूप में करने के लिए क्या संभव तंत्र यहाँ पर जा रहा है, या कैसे एक sol'n आगे बढ़ाने के लिए किया जाता है खो रहा हूँ। मैं इंटेल 2500 के सीपीयू \ विन 7 पर हूं। वीएस के एक्सप्रेस संस्करण।

धन्यवाद।

उत्तर

9

यदि आप किसी भी AVX256 निर्देश का उपयोग करते हैं, तो "एवीएक्स ऊपरी राज्य" "गंदे" बन जाता है, जिसके परिणामस्वरूप आप बड़े पैमाने पर एसएसई निर्देशों का उपयोग करते हैं (जिसमें एक्सएम रजिस्ट्रार में प्रदर्शन स्केलर फ़्लोटिंग-पॉइंट शामिल है)। यह इंटेल अनुकूलन मैनुअल, में दर्ज है जो आप कर सकते हैं download for free (और है बहुत जरूरी पढ़ने के लिए आप काम की इस तरह कर रहे हैं):

AVX अनुदेश हमेशा YMM रजिस्टर और SSE निर्देश के ऊपरी बिट्स को संशोधित करता है ऊपरी बिट्स को संशोधित न करें।

• स्वच्छ: YMM के सभी ऊपरी बिट्स शून्य हैं एक हार्डवेयर दृष्टिकोण से, YMM रजिस्टर संग्रह के ऊपरी बिट्स तीन में से एक राज्यों में माना जा सकता है। यह वह राज्य है जब प्रोसेसर रीसेट से शुरू होता है।

• संशोधित और इस क्षेत्र YMM के ऊपरी बिट्स की सामग्री XSAVE को बचाया मैचों XSAVE क्षेत्र में डेटा सहेजा पंजीकृत करता है। यह तब होता है जब XSAVE/XRSTOR निष्पादित करता है।

• संशोधित और अनसुलझा: एक एवीएक्स निर्देश (या तो 256-बिट या 128-बिट) का निष्पादन गंतव्य वाईएमएम के ऊपरी बिट्स को संशोधित करता है।

AVX/SSE संक्रमण जुर्माना लागू होता है जब भी प्रोसेसर राज्यों "संशोधित और न सहेजा गया" है। VZEROUPPER का उपयोग प्रोसेसर राज्यों को "साफ" करने के लिए स्थानांतरित करता है और संक्रमण दंड से बचता है।

आपका दिनचर्या B() YMM राज्य dirties, तो A() स्टालों में SSE कोड। समस्या से बचने के लिए और A के बीच VZEROUPPER निर्देश डालें।

+0

मुझे गोदर्डेड किया जाएगा। इसने काम कर दिया। मैं इसे लेता हूं इसका मतलब है कि exp() 128 बिट एसएसई का उपयोग 256 बिट कोड नहीं कर रहा है। मुझे यह जानने के लिए पर्याप्त परिचित नहीं है कि क्या ऐसा कुछ है जिसे आसानी से परिवर्तित किया जा सकता है। – AronMiller

+0

@AronMiller: मदद करने में खुशी। सुनिश्चित करें कि आप कभी भी AVX का उपयोग करते हुए 'VZEROUPPER' का उपयोग करते हैं और आपके पास स्वामित्व वाले कोड पर नियंत्रण गुजर रहे हैं। और उन मामलों में अपने लिए इसे सम्मिलित करने के लिए अपने कंपाइलर के खिलाफ एक बग दर्ज करना सुनिश्चित करें। –

+0

एसएसई से AVX128 के प्रत्यक्ष अनुवाद हैं, निर्देश संदर्भ मैनुअल में दस्तावेज। मुझे लगता है कि आईसीसी आपके लिए रूपांतरण कर सकता है, लेकिन मुझे अभी तक ऐसा करने वाले किसी भी अन्य कंपाइलर्स के बारे में पता नहीं है। –

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