2011-01-31 13 views
6

सी/सी ++ कंपाइलर्स केवल ओएस, -ओ 1 और -ओ 2 का उपयोग करते समय स्थिर पैरामीटर (संकलित समय पर ज्ञात) के साथ एकल परत फ़ंक्शंस को अनुकूलित करते हैं। वे सभी परतों को अनुकूलित नहीं करते हैं। केवल -O3 ऐसा कर सकता है। जीसीसी WinAVR 4.3.3 है जो विशेषता "अनुकूलन" का समर्थन नहीं करता है।सी/सी ++ कॉलिंग फ़ंक्शंस में निरंतर चर के लिए अनुकूलित करें

void inner(double value) 
{ 
    //operations using value 
    //... 
} 

void outer(double value) 
{ 
    //few operations using value 
    //... 
    inner(value); 
} 

int main() 
{ 
    inner(1); //optimize 
    outer(1); //only optimize by using -O3 
} 

अनुवर्ती के अलावा अन्य संभावित समाधान क्या हैं?

  1. -O3 पकड़ प्रोग्राम या फ़ाइल (दुरुपयोग आकार को उड़ाने जाएगा)
  2. विशेषता कार्यों के लिए -O3 अनुकूलन (4.3.3 का समर्थन नहीं करता)
  3. मैक्रो (त्रुटि प्रवण)

अद्यतन:

//inner function 
static inline void _delay_us(double __us) __attribute__((always_inline)); 
//outer function 
void f(double); 
inline f1(double); 
static inline f2(double); 
static f3(double); 

f1 अनुकूलित है ख चेतावनी देने के लिए '_delay_us' स्थिर है लेकिन इनलाइन फ़ंक्शन 'f1' में उपयोग किया जाता है जो स्थैतिक फ़ंक्शन समस्या के कारण स्थिर नहीं है। दूसरों को अनुकूलित नहीं किया गया है।


समाधान:

static inline void outer(double) __attribute__((always_inline)); 

इनलाइन कुंजी है। मेरा बाहरी कार्य इनलाइन के लिए बहुत बड़ा है। विशेषता हमेशा_इनलाइन फ़ंक्शन को इनलाइन होने के लिए मजबूर करती है। यह संकलक को अनुकूलन को समझने की कोशिश करने से कम संकलन लागत के साथ फ़ंक्शन को अनुकूलित करने की अनुमति देता है। -ओ 3 ऑप्टिमाइज़ेशन करने के लिए पर्याप्त स्मार्ट है लेकिन नहीं। - कुछ संकलक विकल्पों की आवश्यकता हो सकती है। (कीवर्ड स्थिर आवश्यक है क्योंकि आंतरिक फ़ंक्शन भी स्थिर इनलाइन है।)

+0

एचएम, मुझे समझ में नहीं आ रहा है कि यह चिंता क्यों है। यदि आप संकलक को अनुकूलित करना चाहते हैं, तो उसे बताएं। यदि आपको डर है कि '-O3' (या जो भी स्तर) आपके कोड आकार को उड़ाता है, तो' ओएस 'जाने का रास्ता है। –

+0

कोड 8-बिट माइक्रोकंट्रोलर में उपयोग किया जाता है जिसमें हार्डवेयर फ़्लोटिंग पॉइंट एएलयू नहीं होता है। -ओ 3 वास्तव में इस समारोह में -ओएस से छोटे कोड आकार देते हैं, 4k बनाम 400 – keithyip

उत्तर

3

मैक्रो विकल्प (3) के समान कुछ हद तक, लेकिन मैक्रो के नुकसान के बिना, आप विशिष्ट फ़ंक्शन inline बना सकते हैं, जो आम तौर पर वांछित निरंतर अनुकूलन में परिणाम देगा। बेशक यह केवल तभी मदद करता है जब आप एक ही स्थान से (या कुछ स्थानों से) प्रासंगिक कार्यों को बुला रहे हों, अन्यथा कोड ब्लोट एक मुद्दा बन जाता है।

ध्यान दें कि जीसीसी में विशिष्ट इनलाइन फ़ंक्शंस को हमेशा रेखांकित करने के लिए मजबूर करने का प्रावधान है (इसे संकलक के विवेकाधिकार में छोड़ने के बजाय): __attribute__ ((always_inline))। अन्य कंपाइलर्स में आमतौर पर एक समान तंत्र होगा, हालांकि यह कमांड लाइन स्विच या प्रगामा हो सकता है।

+0

ध्यान दें कि (मानक सी ++) 'इनलाइन' केवल कंपाइलर के लिए एक संकेत है। संकलक ऐसे संकेतों को अनदेखा कर सकता है अगर संकलक निर्धारित करता है कि इनलाइनिंग इसके लायक नहीं है या आवश्यक नहीं है। यह निर्णय कैसे किया जाता है कार्यान्वयन पर निर्भर है। –

+0

@ सिलिको में: सत्य, लेकिन जीसीसी आपको इनलाइन फ़ंक्शंस को रेखांकित करने की अनुमति देता है: '__atttribute__ ((always_inline))' –

+0

मुझे इनलाइन करने का प्रयास करने से चूक गया! मैंने पोस्ट अपडेट किया। – keithyip

1

कम से कम, G12 में -O झंडे केवल अन्य झंडे के पूरे भार को चालू करते हैं, उदाहरण के लिए देखें। http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html। आप केवल उन लोगों को सक्षम कर सकते हैं जिन्हें आप रुचि रखते हैं, हालांकि यह आमतौर पर निराश होता है।

ध्यान दें कि मुझे यकीन नहीं है कि उदा। -O2 और -O3 पर जीसीसी अनिवार्य रूप से कोई संकेतक है कि एक पूरी तरह से अलग संकलक क्या करेगा।

+0

माइक्रोकंट्रोलर प्रोग्रामिंग में व्यक्तिगत विकल्प बहुत उपयोगी होते हैं। – keithyip

+0

@ कुछ भी नहीं: वास्तव में, हालांकि यह अक्सर अपने अनुभव में, कोने में खुद को इंजीनियरिंग करने का नेतृत्व करता है! –

0

एक सामान्य बिंदु के रूप में, यदि आप संकलक को जो जानकारी प्रदान करते हैं उसे बढ़ाते हैं तो यह बेहतर अनुकूलन करने में सक्षम हो सकता है।

उदाहरण के लिए

, यह मानते हुए उन केवल कॉल inner और outer तो आप उनके दायरा सीमित और संकलक कि यह कैसे उन्हें का अनुकूलन में और अधिक लचीलापन अनुमति देने के लिए static के रूप में उन्हें घोषित कर सकते हैं।

कार्यों की वास्तविक सामग्री आप भी const जो संकलक की सुविधा देता है के रूप में अपने मानकों की घोषणा कर सकती है पर निर्भर करता है तुरंत पता है कि वे बदला नहीं जा सकता बिना यह कोड

static void inner(const double value) 
{ 
    //operations using value 
} 

static void outer(const double value) 
{ 
    //few operations using value 
    //... 
    inner(value); 
} 
+0

कॉन्स पैरामीटर ज्यादा मदद नहीं करता है। मेरा बाहरी कार्य इनलाइन को मजबूर किए बिना ऑटो ऑप्टिमाइज़ करने के लिए महंगा समय संकलित है। – keithyip

0

कैसे के बारे में शुरू करने के लिए एक का विश्लेषण करने के लिए ', inner और outer की परिभाषाओं सहित, और केवल उस फ़ाइल को -O3 के साथ संकलित करते हुए, अपने स्वयं के सीपीपी में परिभाषित किया गया है?

हालांकि इसके अपने नुकसान हैं।

+0

मैं कुछ पुस्तकालय लिख रहा हूं। जटिल सेटअप उपयोगकर्ताओं के लिए उपयोगकर्ता के अनुकूल नहीं है लेकिन व्यक्तिगत फ़ाइलों के लिए ठीक अनुकूलन नियंत्रण उत्पादन में बहुत उपयोगी है। – keithyip