में लूप अनोलिंग व्यवहार यह प्रश्न GCC 5.1 Loop unrolling पर एक अनुवर्ती प्रश्न है।जीसीसी
GCC documentation के अनुसार, और इसके बाद के संस्करण सवाल का मेरा उत्तर में कहा गया है, झंडे ऐसे पर -funroll-loops
बारी "पूरा पाश छीलने (पुनरावृत्तियों के एक छोटे से लगातार संख्या के साथ छोरों की अर्थात पूरी तरह से निकाला)" के रूप में। इसलिए, जब ऐसा ध्वज सक्षम होता है, तो संकलक एक लूप को अनलोल करना चुन सकता है यदि यह निर्धारित करता है कि यह कोड के दिए गए टुकड़े के निष्पादन को अनुकूलित करेगा।
फिर भी, मैंने अपनी परियोजनाओं में से एक में देखा कि जीसीसी कभी-कभी को अनलॉक कर देगा, भले ही संबंधित झंडे सक्षम नहीं थे। उदाहरण के लिए, कोड की निम्न सरल टुकड़ा पर विचार करें:
int main(int argc, char **argv)
{
int k = 0;
for(k = 0; k < 5; ++k)
{
volatile int temp = k;
}
}
जब -O1
साथ संकलन, पाश unrolled है और निम्नलिखित विधानसभा कोड जीसीसी के किसी भी आधुनिक संस्करण के साथ उत्पन्न होता है:
main:
movl $0, -4(%rsp)
movl $1, -4(%rsp)
movl $2, -4(%rsp)
movl $3, -4(%rsp)
movl $4, -4(%rsp)
movl $0, %eax
ret
यहां तक कि जब यह सुनिश्चित करने के लिए अतिरिक्त -fno-unroll-loops -fno-peel-loops
के साथ संकलन अक्षम, जीसीसी अप्रत्याशित रूप से ऊपर वर्णित उदाहरण पर लूप अनोलिंग करता है।
यह अवलोकन मुझे निम्नलिखित निकट से संबंधित प्रश्नों की ओर ले जाता है। जीसीसी इस व्यवहार से संबंधित झंडे अक्षम होने के बावजूद लूप अनोलिंग क्यों करता है? अनलॉकिंग अन्य झंडे द्वारा नियंत्रित भी है जो कुछ मामलों में संकलक को लूप को अनलॉक कर सकता है भले ही -funroll-loops
अक्षम है? क्या GCC में लूप अनोलिंग को पूरी तरह अक्षम करने का कोई तरीका है (-O0
के साथ संकलित करने का एक हिस्सा)?
दिलचस्प बात यह है बजना संकलक यहां अपेक्षित व्यवहार है, और केवल unrolling प्रदर्शन करने के लिए जब -funroll-loops
सक्षम किया गया है, और अन्य मामलों में नहीं लगता है।
अग्रिम धन्यवाद, इस मामले पर किसी भी अतिरिक्त अंतर्दृष्टि की सराहना की जाएगी!
बधाई। आपने पाया है कि अलग-अलग कंपाइलर व्यवहार में भिन्न होते हैं और आप जिन झंडे को पास करते हैं, उनका हमेशा यह अर्थ नहीं होता कि आप क्या सोच सकते हैं। असल दुनिया में आपका स्वागत है। –
क्या यह आपके प्रोग्राम की कार्यक्षमता को तोड़ता है? – Serge
नहीं, यह कार्यक्षमता को तोड़ता नहीं है। यह सामान्य ब्याज का सवाल है कि कैसे जीसीसी लूप अनोलिंग करता है और इस व्यवहार को कैसे ट्यून करता है। – Pyves