जीएनयू / लिनक्स को -O3 अनुकूलन के साथ संकलित करना


18

यह कहा जाता है कि -O3gc ऑप्टिमाइज़ेशन विकल्प के साथ GNU टूल्स और लिनक्स कर्नेल को संकलित करना अजीब और फंकी बग पैदा करेगा। क्या यह सच है? किसी ने यह कोशिश की है या यह सिर्फ एक धोखा है?


इसके अलावा दिलचस्प रूप -O0से बिल्कुल भी समर्थित नहीं है! stackoverflow.com/questions/29151235/…
Ciro Santilli 改造 est est est

जवाबों:


8

यह Gentoo में उपयोग किया जाता है, और मैंने कुछ भी असामान्य नहीं देखा।


8
हालाँकि कृपया ध्यान दें कि -O3 को अक्सर ईबिल्ड द्वारा फ़िल्टर किया जाता है।
मैकीज पाइचोटका

17

-O3 इसके कई नुकसान हैं:

  1. सबसे पहले यह अक्सर -O2या की तुलना में धीमी कोड का उत्पादन करता है -Os। कभी-कभी यह लूप के अनियंत्रित होने के कारण लंबे समय तक कोड का उत्पादन करता है जो कोड के बदतर कैश प्रदर्शन के कारण वास्तव में धीमा हो सकता है।
  2. जैसा कि कहा गया था कि यह कभी-कभी गलत कोड का उत्पादन करता है। यह या तो अनुकूलन में त्रुटि या कोड में त्रुटि के कारण हो सकता है (जैसे सख्त अलियासिंग की अनदेखी)। जैसा कि कर्नेल कोड कभी-कभी होता है और कभी-कभी 'स्मार्ट' होना पड़ता है, मैं कहूंगा कि यह संभव है कि कुछ कर्नेल डेवलपर ने कुछ त्रुटि की हो। मैंने विभिन्न अजीब समस्याओं का अनुभव किया, जैसे कि यूजरस्पेस यूटिलिटीज का दुर्घटनाग्रस्त हो जाना, जब मैंने कर्नेल को gcc 4.5 के साथ संकलित किया जो उस समय स्थिर था। मैं अभी भी विभिन्न बगों के कारण कर्नेल और कई चयनित यूज़रस्पेस उपयोगिताओं के लिए gcc 4.4 का उपयोग करता हूं। वही इसके लिए आवेदन कर सकता है -O3
  3. मुझे नहीं लगता कि यह लिनक्स कर्नेल के लिए बहुत लाभ प्रदान करता है। कर्नेल भारी गणना नहीं करता है और जिन स्थानों पर यह करता है, वह असेंबली के साथ अनुकूलित है। -O3झंडा संदर्भ स्विचिंग की लागत या I / O की गति को नहीं बदलेगा। मुझे नहीं लगता कि कुल प्रदर्शन का 0.1% स्पीडअप जैसा कुछ है।

6
लिनक्स को -fno- सख्त-अलियासिंग के साथ संकलित किया गया है क्योंकि लिनस को लगता है कि gcc बेवकूफ है और अत्यधिक प्रतिबंधक है क्योंकि यह बेवकूफों की तरह व्यवहार करता है, भले ही वे स्पष्ट रूप से स्पष्ट नहीं हैं (यानी अलियासिंग एक फ़ंक्शन और संकलक के रूप में पेश किया गया था) इसे देखें)। mail-archive.com/linux-btrfs@vger.kernel.org/msg01647.html
Spudd86

@ स्पडियरी: क्या उनका मतलब यह था कि वे स्पष्ट रूप से इंसानों के पढ़ने के कोड या संकलक के लिए नहीं हैं? जैसा कि मैंने कहा - कर्नेल को कभी-कभी उन स्मार्ट चीजों को करने की आवश्यकता होती है जो उपयोगकर्ता प्रोग्राम नहीं करना चाहिए। उपयोगकर्ताओं के लिए क्या मायने रखता है (कुछ क्षेत्रों में भारी अनुकूलन) कर्नेल के लिए कोई मतलब नहीं हो सकता है (विभिन्न स्थानों में स्मार्ट कोड + अड़चन की बड़ी मात्रा)।
मकीज पीचोटका

1
नहीं, जो उन्होंने कहा वह भी उपयोगकर्ताओं के लिए लागू होता है।
Spudd86

1
@ स्पड86: मैं इससे असहमत हूं। इस तरह की 'स्पष्ट' चीजों को पहचानने के लिए कंपाइलर को 'स्मार्ट' बना देना मामूली नहीं है। तो एक ही संभव तरीका है एक) केवल धीमी (एर) कोड का उत्पादन (जो कि, एचपीसी) में कुछ उपयोग के मामलों के लिए अस्वीकार्य है, और / या प्रोग्राम बी को मैन्युअल रूप से अनुकूलित करने के लिए प्रोग्रामर को बाध्य करता है) 'डम्बर' की अनुमति देने के लिए नियमों को सख्त बनायें संकरण बनाने के लिए संकलक - सी मानक द्वारा लिया गया मार्ग।
मैकीज पीचोटका

6

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

सीधे शब्दों में कहें, कुछ मूलभूत पुस्तकालय और OS सुविधाएँ वास्तव में कोड पर निर्भर करती हैं कि वह क्या कहती है, न कि कई मामलों में तेजी से। विशेष रूप से -fgcse- के बाद पुनः लोड (-O3 द्वारा सक्षम) विषम मुद्दों का कारण बन सकता है।


5

पिछले 10 वर्षों में मैं -O3 -march=nativeविश्व स्तर पर 1000+ पैकेज के साथ कई Gentoo सिस्टम चला रहा हूं और अभी तक इनमें से किसी भी पौराणिक स्थिरता के मुद्दे पर नहीं चल रहा -O3है। सीपीयू गहन अनुप्रयोगों (जैसे गणित / विज्ञान ऐप) के बेंचमार्क लगातार -O3तेज कोड का उत्पादन करने के लिए दिखाते हैं , आखिरकार अगर यह नहीं हुआ तो यह बेकार हो जाएगा। अधिकांश डेस्कटॉप ऐप्स के CFLAGSलिए वैसे भी बहुत ज्यादा मायने नहीं रखता है क्योंकि वे IO बाउंड हैं, लेकिन यह सर्वर साइड सामान के लिए बहुत मायने रखता है जो CPU बाउंड है।


3

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


यह उल्लेख करने के लिए नहीं कि यह हमेशा तेज़ नहीं होता है, आपको वास्तव में बेंचमार्क के साथ आना होगा और -O2मौसम का पता करने के लिए इसका परीक्षण करना होगा या नहीं यह दर्द होता है या मदद नहीं करता है
स्पडियरी

0

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

इसके बारे में सोचें: क्या सिस्टम क्रैश या संभावित डेटा हानि और / या भ्रष्टाचार के लायक छापे और ext3 सबसिस्टम का 5% प्रदर्शन लाभ है?

आपके द्वारा चलाए जा रहे उस क्वेक पोर्ट के लिए इच्छित सभी नॉब को ट्विक करें या आप अपने डीवीडी संग्रह को डिवाइड करने के लिए ऑडियो / वीडियो कोडेक्स का उपयोग करें। आप संभवतः एक सुधार देखेंगे। बस w / कर्नेल को गड़बड़ न करें जब तक आपके पास समय बर्बाद और डेटा न हो जिसे आप खो सकते हैं।


3
मैं यह नहीं पूछ रहा हूं कि क्या यह मूल्य है या नहीं, सुरक्षित है या नहीं, या हमें ऐसा क्यों नहीं करना चाहिए, मैं क्या पूछ रहा हूं तथ्य यह है कि क्या यह वास्तव में वास्तविक अनुप्रयोग में बग पैदा करता है ?, क्या यह कभी हुआ है? क्या यह साबित हुआ ..
यूरे
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.