मैं एवीएक्स इंट्रिनिक्स का उपयोग कर वीसी ++ में फीड फॉरवर्ड नेट लिख रहा हूं। मैं इस कोड को 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 पर हूं। वीएस के एक्सप्रेस संस्करण।
धन्यवाद।
मुझे गोदर्डेड किया जाएगा। इसने काम कर दिया। मैं इसे लेता हूं इसका मतलब है कि exp() 128 बिट एसएसई का उपयोग 256 बिट कोड नहीं कर रहा है। मुझे यह जानने के लिए पर्याप्त परिचित नहीं है कि क्या ऐसा कुछ है जिसे आसानी से परिवर्तित किया जा सकता है। – AronMiller
@AronMiller: मदद करने में खुशी। सुनिश्चित करें कि आप कभी भी AVX का उपयोग करते हुए 'VZEROUPPER' का उपयोग करते हैं और आपके पास स्वामित्व वाले कोड पर नियंत्रण गुजर रहे हैं। और उन मामलों में अपने लिए इसे सम्मिलित करने के लिए अपने कंपाइलर के खिलाफ एक बग दर्ज करना सुनिश्चित करें। –
एसएसई से AVX128 के प्रत्यक्ष अनुवाद हैं, निर्देश संदर्भ मैनुअल में दस्तावेज। मुझे लगता है कि आईसीसी आपके लिए रूपांतरण कर सकता है, लेकिन मुझे अभी तक ऐसा करने वाले किसी भी अन्य कंपाइलर्स के बारे में पता नहीं है। –