2010-11-01 7 views
35

मैं किसी विशेष लूप को अनलॉक करने के लिए जीसीसी को कैसे बता सकता हूं? मैंने सीयूडीए एसडीके का उपयोग किया है जहां लूप को #pragma unroll का उपयोग करके मैन्युअल रूप से अनलॉक किया जा सकता है। क्या जीसीसी के लिए एक समान सुविधा है? मैं थोड़ी गड़बड़ कर गया लेकिन कुछ भी नहीं मिला।विशेष रूप से लूप को अनलोल करने के लिए जीसीसी को बताएं

+6

मुझे विश्वास नहीं है कि मैं यह कहने जा रहा हूं। यदि आपको कुछ और नहीं मिला है तो हमेशा ... डफ की डिवाइस है। अब, मैंने * क्या * मैंने उस अपराधी के लश को रखा था? मैं इसे यहाँ कहीं से जानता हूं ... – dmckee

+0

हे क्या आप मैक्रोज़ का उपयोग कर ऐसा कर सकते हैं? शायद नहीं, तो बस इसे लिखना ही एकमात्र चीज बाकी है? – Nils

+6

सभी गंभीरता में, मैं सुझाव देता हूं कि डफ के डिवाइस का उपयोग करने से पहले '-फनोल-लूप' के साथ उस बिट के अलग संकलन को देखने का सुझाव दें: यह अध्ययन करने के लिए एक सुंदर बात है, लेकिन आपके कोड में एक बदसूरत चीज है। – dmckee

उत्तर

43

जीसीसी इस से निपटने में कुछ भिन्न तरीकों से आप देता है: के रूप में देखा,

  • उपयोग #pragma निर्देशों, #pragma GCC optimize ("string"...) की तरह GCC docs में। ध्यान दें कि प्रगति शेष कार्यों के लिए अनुकूलन वैश्विक बनाता है। जीसीसी के गुण वाक्य रचना साथ

    #pragma GCC push_options 
    #pragma GCC optimize ("unroll-loops") 
    
    //add 5 to each element of the int array. 
    void add5(int a[20]) { 
        int i = 19; 
        for(; i > 0; i--) { 
         a[i] += 5; 
        } 
    } 
    
    #pragma GCC pop_options 
    
  • एन्नोटेट व्यक्तिगत कार्यों:: यदि आप #pragma push_options और pop_options मैक्रो चतुराई से इस्तेमाल किया है, तो आप शायद यह चारों ओर तो जैसे सिर्फ एक समारोह निर्धारित कर सकते हैं पर एक अधिक विस्तृत शोध प्रबंध के लिए GCC function attribute डॉक्स की जाँच विषय। एक उदाहरण:

    //add 5 to each element of the int array. 
    __attribute__((optimize("unroll-loops"))) 
    void add5(int a[20]) { 
        int i = 19; 
        for(; i > 0; i--) { 
         a[i] += 5; 
        } 
    } 
    

नोट: मुझे यकीन है कि कितना अच्छा जीसीसी unrolling रिवर्स दोहराया छोरों (मैं इसे Markdown मेरी कोड के साथ अच्छा खेलने के लिए प्राप्त करने के लिए किया था) पर है नहीं कर रहा हूँ। उदाहरणों को ठीक संकलित करना चाहिए, यद्यपि।

+1

बहुत अच्छा है कि इसके लिए एक फ़ंक्शन विशेषता है, हालांकि इसे आईओएस के लिए ऐप्पल के नवीनतम जीसीसी द्वारा अनदेखा किया गया है: "चेतावनी: 'अनुकूलन' विशेषता निर्देश अनदेखा किया गया"। (मुझे पता है कि वे एलएलवीएम में परिवर्तित हो गए हैं लेकिन मैं अभी भी कभी-कभी जीसीसी का उपयोग कर रहा हूं, क्योंकि कभी-कभी तेज़ कोड उत्पन्न होता है।) कोई भी जानता है कि इसे क्यों नजरअंदाज किया जाता है? क्या ऐप्पल की जीसीसी शाखा बहुत पुरानी है? एक तरफ ध्यान दें, जिस फ़ंक्शन पर मैं इसका उपयोग कर रहा हूं, वैसे भी जब तक मैं -O3 का उपयोग करता हूं तब तक लूप अनलॉक हो जाते हैं। – Simplex

+0

मैंने अभी '__attribute __ ((ऑप्टिमाइज़ (" अनलोल-लूप ") को आजमाया है)) कुछ एम्बेडेड कोड के साथ और यह केवल 3% की गति में सुधार हुआ। मैन्युअल रूप से 8 गुना सुधार की गति 12% बढ़ी है और कार्यक्रम के आकार में उतना ही वृद्धि नहीं हुई है। – endolith

+0

मेरा जीसीसी चेतावनी देता है: #pragma अनुकूलन को अनदेखा कर रहा है ... क्या यह हमेशा उपलब्ध है? – neodelphi

3

-funroll-loops उपयोगी हो सकता है (हालांकि यह वैश्विक स्तर पर लूप-अनोलिंग चालू करता है, प्रति-लूप नहीं)। मुझे यकीन है कि एक #pragma लगा सकते हैं कि ऐसा ही करने के लिए नहीं कर रहा हूँ ...

+0

नहीं, मुझे यह भी मिला, लेकिन मैं ब्रॉडकॉम से एक विशिष्ट लूप – Nils

+0

बेमेई को अनलोल करना चाहता हूं, पैच का एक सेट है जीसीसी को "#pragma अनोल" समर्थन जोड़ने के लिए। – osgx

+1

@ जेरी कॉफिन, मैं इसका उपयोग कैसे कर सकता हूं? क्या आप मुझे एक कमांड दे सकते हैं जो -फनोल-लूप का उपयोग करता है? –

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