2010-05-17 19 views
7

मैं उत्सुक हूं, नए कंपाइलर नए सीपीयू जैसे एमएमएक्स एसएसई, 3 डी एनओ में निर्मित कुछ अतिरिक्त सुविधाओं का उपयोग करते हैं! इसलिए?सी/सी ++ विशेष सीपीयू विशेषताओं का उपयोग

मेरा मतलब है, मूल 8086 में कोई एफपीयू भी नहीं था, इसलिए पुराने कंपाइलर पुराने भी इसका उपयोग नहीं कर सकते हैं, लेकिन नए कंपाइलर कर सकते हैं, क्योंकि एफपीयू हर नए सीपीयू का हिस्सा है। तो, क्या नए कंपाइलर सीपीयू की नई सुविधाओं का उपयोग करते हैं?

या, यह पूछने का अधिक अधिकार होना चाहिए, क्या नया सी/सी ++ स्टैंडअर्ट लाइब्रेरी फ़ंक्शंस नई सुविधाओं का उपयोग करता है?

उत्तर के लिए धन्यवाद।

संपादित करें:

ठीक है, तो, अगर मैं सही तुम सब मिलता है, यहां तक ​​कि कुछ standart संचालन, विशेष रूप से नाव की संख्या के साथ तेजी से SSE का उपयोग किया जा सकता है।

इसका उपयोग करने के लिए, मुझे यह सुविधा मेरे कंपाइलर में सक्षम करनी चाहिए, अगर यह इसका समर्थन करती है। यदि ऐसा होता है, तो मुझे यह सुनिश्चित करना होगा कि लक्षित प्लेटफ़ॉर्म उन सुविधाओं का समर्थन करता है।

कुछ सिस्टम लाइब्रेरीज़ के मामले में जिनके लिए शीर्ष प्रदर्शन की आवश्यकता होती है, जैसे ओपनजीएल, डायरेक्टएक्स और इसलिए, यह समर्थन सिस्टम में समर्थित हो सकता है।

डिफ़ॉल्ट रूप से, संगतता कारणों के लिए, कंपाइलर इसका समर्थन नहीं करता है, लेकिन आप विशेष सी फ़ंक्शंस का उपयोग करके इस समर्थन को जोड़ सकते हैं, उदाहरण के लिए इंटेल। यह सबसे अच्छा तरीका होना चाहिए, क्योंकि आप बहु-सीपीयू-समर्थन अनुप्रयोगों को लिखने के लिए, वांछित प्लेटफॉर्म की विशेष विशेषताओं का उपयोग करते समय सीधे पहिये को नियंत्रित कर सकते हैं।

+1

अपने अगले स्टैक ओवरफ़्लो पोस्ट में, कृपया अपने प्रश्नों के बीच खाली रेखाएं जोड़ें क्योंकि इससे लोगों को प्रश्नों को आसानी से पहचानने की अनुमति मिलती है (विशेष रूप से जब आपके लिए जवाब विकसित होते हैं)। –

+0

ठीक है, सलाह के लिए धन्यवाद। –

+0

इस बात पर विचार करें कि विभिन्न प्रोसेसर परिवारों पर भी एक बुनियादी 'एड' अलग-अलग लागू किया गया है। एसपीई आउटपुट और गैर-एसएसई आउटपुट के बीच चयन करते समय पीपीसी आउटपुट और इंटेल आउटपुट के बीच चयन करते समय संकलक एक ही मूल गति से गुजरता है। –

उत्तर

4

जीसीसी कमांड लाइन तर्कों के माध्यम से नए निर्देशों का समर्थन करेगा। अधिक जानकारी के लिए here देखें। के शब्दों में:

जीसीसी MMX, SSE, SSE2, SSE3 में अतिरिक्त निर्देशों और 3DNow एक्सटेंशन हाल इंटेल और एएमडी प्रोसेसर के का लाभ ले सकते। विकल्प- mmmx, -msse, -msse2, -msse3 और -m3dnow को समानांतर में संसाधित करने के लिए डेटा के एकाधिक शब्दों को अनुमति देने के लिए इन अतिरिक्त निर्देशों का उपयोग सक्षम करें। जिसके परिणामस्वरूप निष्पादनयोग्य केवल उचित एक्सटेंशन समर्थन प्रोसेसर पर चलेगा - अन्य सिस्टम पर वे एक अवैध अनुदेश त्रुटि (या समान) के साथ दुर्घटना होगा

1

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

आपको अपने कंपाइलर के साथ आने वाले दस्तावेज़ों का अध्ययन करने की आवश्यकता होगी।

0

वर्रींग कंपाइलर्स अलग-अलग नई सुविधाओं का उपयोग करेंगे। विजुअल स्टूडियो एसएसई/2 का उपयोग करेगा, और मेरा मानना ​​है कि इंटेल कंपाइलर सीपीयू सुविधाओं में नवीनतम का समर्थन करेगा। आपको, निश्चित रूप से, अपनी पसंदीदा सुविधा के बाजार में प्रवेश के बारे में सावधान रहना चाहिए।
आपकी पसंदीदा मानक लाइब्रेरी का उपयोग करने के लिए, यह उस पर निर्भर करता है जिस पर इसे संकलित किया गया था। हालांकि, सी ++ मानक लाइब्रेरी आम तौर पर साइट पर संकलित होती है, क्योंकि यह बहुत तेज़ है, इसलिए यदि आप एसएसई 2 सक्षम करते हैं, तो सी ++ एसडीडी libs का उपयोग करना चाहिए। सीआरटी के लिए, इस पर निर्भर करता है कि उन्हें किस प्रकार संकलित किया गया था।

0

वहाँ आम तौर पर दो तरह से एक संकलक कोड इस तरह के विशेष सुविधाओं का उपयोग करता है उत्पन्न कर सकते हैं कर रहे हैं:

  1. जब संकलक ही संकलित किया गया है, तो आप इसे एक विशेष वास्तुकला के लिए कोड उत्पन्न करने के लिए कॉन्फ़िगर है, और यह लाभ ले सकते हैं किसी भी विशेषता के बारे में यह जानता है कि आर्किटेक्चर होगा। उदाहरण के लिए, यदि यह gcc एक इंटेल प्रोसेसर के लिए पर्याप्त है (या यह "पर्याप्त पुराना नहीं है?) एक एकीकृत एफपीयू रखने के लिए कॉन्फ़िगर किया गया है, तो यह फ़्लोटिंग-पॉइंट निर्देश उत्पन्न करेगा।
  2. जब संकलक का आह्वान किया जाता है, झंडे या पैरामीटर प्रोसेसर को उपलब्ध सुविधाओं के प्रकार निर्दिष्ट कर सकते हैं जो प्रोग्राम चलाएंगे, और फिर संकलक को पता चलेगा कि इन सुविधाओं का उपयोग करना सुरक्षित है। यदि झंडे मौजूद नहीं हैं, तो यह उन सुविधाओं द्वारा प्रदान किए गए विशेष निर्देशों का उपयोग किये बिना समकक्ष कोड उत्पन्न करेगा।
+0

* "जब संकलक स्वयं संकलित होता है" * उहम, संकलन * संकलन * के रूप में जल्द ही ऐसा क्यों होना चाहिए? –

+0

@ विक्टर यह नहीं करता है। मेरा मुद्दा यह है कि जब आप कंपाइलर बनाते हैं, तो यह स्वचालित रूप से 8086, पेंटियम, पावरपीसी, एसपीएआरसी, जो भी हो, निष्पादन योग्य बनाने के लिए इसे कॉन्फ़िगर करने के आधार पर अपने लक्षित प्लेटफ़ॉर्म के बारे में कुछ मूल बातें जानता है। यदि आप पेंटियम-संगत निष्पादन योग्य उत्पन्न करने के लिए एक कंपाइलर बनाते हैं, तो यह x86 आर्किटेक्चर से पहले विशेष सुविधाओं का उपयोग कर सकता है, जो कि 386 में नहीं थे, उदाहरण के लिए, भले ही वे एक ही परिवार में हों। –

2

ये निर्देश किसी भी आईएसओ सी/सी ++ मानकों का हिस्सा नहीं हैं। वे इस्तेमाल किए गए कंपाइलर के आधार पर कंपाइलर इंट्रिनिक्स के माध्यम से उपलब्ध हैं।

MSVC के लिए, http://msdn.microsoft.com/en-us/library/26td21ds(VS.80).aspx

जीसीसी के लिए, आप http://developer.apple.com/hardwaredrivers/ve/sse.html

AFAIK पर दिखाई दे सकता है देखते हैं, SSE intrinsics जीसीसी और MSVC के बीच एक ही हैं।

1

कभी-कभी रनटाइम लाइब्रेरी में एक सुविधा के कई कार्यान्वयन होंगे, और जब प्रोग्राम चलाया जाता है तो पुस्तकालय गतिशील रूप से कार्यान्वयन के बीच चयन करेगा। सीधा फ़ंक्शन कॉल की बजाय ओवरहेड फ़ंक्शन पॉइंटर कॉल की लागत हो सकती है, लेकिन CPU-विशिष्ट अनुकूलित फ़ंक्शन का उपयोग करते समय लाभ अधिक हो सकता है।

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

0

यदि आप सी/सी ++ में लिखे गए कोड के बारे में बात कर रहे हैं, तो नई सुविधाओं को समझाया जाता है यदि आप ऐसा करने के लिए अपने कंपाइलर को बताते हैं। डिफ़ॉल्ट रूप से, आपका कंपाइलर शायद "सादा x86" (स्वाभाविक रूप से एफपीयू के साथ :)) को लक्षित करता है, आमतौर पर इस समय सबसे व्यापक प्रोसेसर पीढ़ी के लिए अनुकूलित किया जाता है, लेकिन फिर भी पुराने प्रोसेसर पर चलने में सक्षम होता है।

यदि आप संकलक को नए निर्देश सेट पर विचार करने के लिए भी कोड उत्पन्न करना चाहते हैं, तो आपको उचित कमांड लाइन स्विच/प्रोजेक्ट सेटिंग के साथ ऐसा करने के लिए कहना चाहिए, उदाहरण के लिए दृश्य सी ++ के लिए एसएसई/एसएसई 2 निर्देश पीढ़ी को सक्षम करने के विकल्प /arch है।

ध्यान दें कि नए निर्देश सेट की कई विशेषताओं का सीधे "सामान्य" कोड में शोषण नहीं किया जा सकता है, इसलिए आपको आमतौर पर नए निर्देश सेट के मूल डेटाटाइप पर काम करने के लिए कंपाइलर इंट्रिनिक्स प्रदान किए जाते हैं।

1

यदि आप इंटेल सी कंपाइलर का उपयोग करते हैं, और पर्याप्त उच्च अनुकूलन विकल्प सेट करते हैं, तो आप पाएंगे कि आपके कुछ लूप 'वेक्टरिज्ड' प्राप्त करते हैं, जिसका अर्थ है कि कंपाइलर ने उन्हें एसएसई-शैली निर्देशों का उपयोग करने के लिए फिर से लिखा है।

यदि आप सीधे एसएसई संचालन का उपयोग करना चाहते हैं, तो आप 'xmmintrin.h' हेडर फ़ाइल में परिभाषित अंतर्निहित सिद्धांतों का उपयोग करते हैं; कहते हैं कि

# शामिल <xmmintrin.h>

__m128 यू, वी, डब्ल्यू; फ्लोट ww [4];

वी = _mm_set1_ps (1.5);

यू = _mm_set_ps (0,1,2,3);

डब्ल्यू = _mm_add_ps (यू, वी);

_mm_storeu_ps (ww, डब्ल्यू);

0

इंटेल एक नया सीपीयू जारी करते समय अद्यतन CPUID उदाहरण कोड प्रदान करता है ताकि आप नई सुविधाओं की जांच कर सकें और जब तक मुझे याद रहे। कम से कम यह वही है जो मैंने पहली बार पाया था, मैंने खुद ही इस सवाल के बारे में सोचा था।

Using CPUID to Detect the presence of SSE 4.1 and SSE 4.2 Instruction Sets

के रूप में नई compilers जारी कर रहे हैं वे उदाहरण के लिए सीधे VS2010 की तरह नई सुविधाएँ जोड़ने। Visual C++ Code Generation in Visual Studio 2010

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