मैं एक उदाहरण देकर अपने प्रश्न पूछूंगा। अब मेरे पास do_something()
नामक एक फ़ंक्शन है।जीसीसी में एसएसई इंट्रिनिक्स के विभिन्न संस्करणों का उपयोग करने का सही तरीका क्या है?
इसमें तीन संस्करण हैं: do_something()
, do_something_sse3()
, और do_something_sse4()
। जब मेरा प्रोग्राम चलता है, तो यह सीपीयू फीचर का पता लगाएगा (देखें कि यह एसएसई 3 या एसएसई 4 का समर्थन करता है) और तदनुसार तीन संस्करणों में से एक को कॉल करें।
समस्या है: जब मैं जीसीसी के साथ अपने कार्यक्रम बनाने, मैं संकलित करने के लिए (उदाहरण के लिए हेडर फाइल <smmintrin.h>
के लिए शामिल किया जाना है) do_something_sse4()
के लिए -msse4
सेट करना होगा।
हालांकि, अगर मैं -msse4
सेट करता हूं, तो जीसीसी को एसएसई 4 निर्देशों का उपयोग करने की अनुमति है, और कुछ अंतर्निहित do_something_sse3()
में कुछ एसएसई 4 निर्देशों में भी अनुवाद किया जाता है। तो यदि मेरा प्रोग्राम सीपीयू पर चलता है जिसमें केवल एसएसई 3 (लेकिन कोई एसएसई 4) समर्थन नहीं है, तो do_something_sse3()
पर कॉल करते समय यह "अवैध निर्देश" का कारण बनता है।
शायद मेरे पास कुछ खराब अभ्यास है। क्या आप कुछ सुझाव दे सकते हैं? धन्यवाद।
मुझे लगता है कि मानक दृष्टिकोण विभिन्न संकलन इकाइयों में विभिन्न संस्करणों को संकलित करना है। – Mysticial
@ मिस्टिकियल, पहले मेरे प्रश्न को संपादित करने के लिए धन्यवाद। जैसा कि मैं समझता हूं, "अलग-अलग संकलन इकाइयों में विभिन्न संस्करणों को संकलित करें" का अर्थ है: सभी 'do_things_sse4' फ़ाइल' functios_sse4.c' में रखें, और इसे '-msse4' विकल्प के साथ संकलित करें; और 'functions_sse3.c' को' -msse3' के साथ संकलित करें। मैं कोशिश करूँगा (मुझे अपने कोडों का पुनर्निर्माण करने की आवश्यकता हो सकती है, जिन्हें मूल रूप से एमएसवीसी के लिए लिखा गया था) – shengbinmeng
हां, यही वही है जो मेरा मतलब था। :) – Mysticial