मैंने इसके लिए जीसीसी मैन पेज को खंगालने की कोशिश की, लेकिन अभी भी यह वास्तव में नहीं मिलता है।
बीच क्या अंतर है -march
और -mtune
?
एक का उपयोग कब होता है -march
, दोनों बनाम? क्या यह सिर्फ कभी संभव है -mtune
?
जवाबों:
यदि आप उपयोग करते हैं -march
तो जीसीसी उन निर्देशों को उत्पन्न करने के लिए स्वतंत्र होगा जो निर्दिष्ट सीपीयू पर काम करते हैं, लेकिन (आमतौर पर) वास्तुकला परिवार में पहले के सीपीयू पर नहीं।
यदि आप अभी उपयोग करते हैं -mtune
, तो संकलक कोड उत्पन्न करेगा जो उनमें से किसी पर भी काम करता है, लेकिन आपके द्वारा बताए गए विशिष्ट सीपीयू पर सबसे तेजी से चलने वाले निर्देश अनुक्रम का पक्ष लेंगे। उदाहरण के लिए, लूप-अनियंत्रित उत्तराधिकार को उस सीपीयू के लिए उचित रूप से सेट करना।
-march=foo
तात्पर्य -mtune=foo
जब तक आप एक अलग निर्दिष्ट नहीं करते -mtune
। यह एक कारण है कि ट्यूनिंग के बारे में कुछ भी किए बिना -march
विकल्पों को सक्षम करने से बेहतर है -mavx
।
कैविएट: -march=native
एक सीपीयू पर जो जीसीसी विशेष रूप से पहचान नहीं करता है, फिर भी नए निर्देश सेट को सक्षम करेगा जो जीसीसी का पता लगा सकता है, लेकिन छोड़ देगा -mtune=generic
। एक नए पर्याप्त जीसीसी का उपयोग करें जो आपके सीपीयू के बारे में जानता है यदि आप चाहते हैं कि यह अच्छा कोड बनाये।
march
इसका मतलब है mtune
। तो, आपकी आपत्तियों के जवाब क्रमशः नहीं और हां हैं।
mtune
और march
संयोजन हो सकते हैं। यह ब्लॉग पोस्ट उस बिंदु को दूसरों के साथ प्रकाशित करता है: lemire.me/blog/2018/07/25/…
यह वही है जो मैंने गुगली किया है:
-march=X
विकल्प के लिए एक सीपीयू नाम लेता है X
और जीसीसी कोड की सभी सुविधाओं का उपयोग करता है उत्पन्न करने के लिए अनुमति देता है X
। जीसीसी मैनुअल वास्तव में बताता है कि कौन से सीपीयू नामों का मतलब है कि कौन से सीपीयू परिवार और सुविधाएँ
क्योंकि सुविधाओं को आमतौर पर जोड़ा जाता है, लेकिन हटाया नहीं जाता है, -march=X
सीपीयू पर बनाया गया एक बाइनरी चलेगा X
, जिसमें सीपीयू को नए की तुलना में चलाने का अच्छा मौका है X
, लेकिन यह लगभग पुराने से अधिक पुरानी चीज़ों पर लगभग नहीं चल पाएगा X
। कुछ निर्देश सेट (3DNow !, मुझे लगता है?) एक विशेष CPU विक्रेता के लिए विशिष्ट हो सकता है, इनका उपयोग करने से संभवतः आपको बायनेरिज़ मिलेंगे जो प्रतिस्पर्धात्मक सीपीयू, नए या अन्यथा पर नहीं चलते हैं।
-mtune=Y
विकल्प पर तेजी से चलाने के लिए तैयार किए गए कोड धुनों Y
अन्य सीपीयू उस पर चला सकता है पर की तुलना में। -march=X
तात्पर्य है -mtune=X
। -mtune=Y
ओवरराइड नहीं करेंगे -march=X
, इसलिए, उदाहरण के लिए, इसका शायद कोई मतलब नहीं है -march=core2
और -mtune=i686
- आपका कोड core2
वैसे भी पुराने से कुछ भी नहीं चलेगा , क्योंकि -march=core2
, इसलिए पृथ्वी पर आप कोर 2 की तुलना में कुछ पुराने (कम फीचर वाले) का अनुकूलन क्यों करना चाहेंगे? -march=core2 -mtune=haswell
अधिक समझ में आता है: क्या core2
प्रदान करता है (जो अभी भी -march=i686
आपको देता है की तुलना में बहुत अधिक है !) से परे किसी भी सुविधाओं का उपयोग न करें , लेकिन बहुत नए haswell
सीपीयू के लिए कोड का अनुकूलन करें, के लिए नहीं core2
।
वहाँ भी है -mtune=generic
। generic
वर्तमान सीपीयू ( generic
जीसीसी के एक संस्करण से दूसरे संस्करण में परिवर्तन का अर्थ) पर चलने वाले जीसीसी उत्पादन कोड बनाता है । गेंटू मंचों पर ऐसी अफवाहें हैं जो कोड का उत्पादन उस कोड की तुलना में अधिक -march=X -mtune=generic
तेजी X
से -march=X -mtune=X
करती है (या -march=X
जैसा -mtune=X
कि निहित है)। कोई अंदाजा नहीं कि यह सच है या नहीं।
आम तौर पर, जब तक आपको ठीक-ठीक पता नहीं होता कि आपको क्या चाहिए, ऐसा लगता है कि सबसे अच्छा कोर्स निर्दिष्ट करना है -march=<oldest CPU you want to run on>
और -mtune=generic
( -mtune=generic
निहितार्थ का मुकाबला करने के लिए यहां है -mtune=<oldest CPU you want to run on>
, क्योंकि आप शायद सबसे पुराने सीपीयू के लिए अनुकूलन नहीं करना चाहते हैं)। या बस -march=native
, अगर आप कभी भी उसी मशीन पर चलने जा रहे हैं जिस पर आप निर्माण करते हैं।
-march=native
, तो आप निर्दिष्ट करना चाह सकते हैं -mtune=X
, क्योंकि डिफ़ॉल्ट अभी भी है -mtune=generic
, जैसा कि यहां चर्चा की गई है: lemire.me/blog/2018/07/25/…
-march=native
तात्पर्य tune=native
यदि आप एक जीसीसी कि अपने CPU के बारे में जानता का उपयोग ठीक। वह लेख केवल बुरे मामले को प्रस्तुत करता है। नए जीसीसी संस्करण सामान्य रूप से बेहतर कोड बनाते हैं, खासकर एवीएक्स 2 और एवीएक्स -51 जैसे नए निर्देशों का उपयोग करते समय। और आपके सीपीयू के लिए डिज़ाइन की गई ट्यूनिंग सेटिंग्स (जैसे लूप अनरोलर ह्यूरिस्टिक्स) एक निश्चित प्लस है। इसलिए यदि आप इन विकल्पों का उपयोग करने के लिए प्रदर्शन के बारे में पर्याप्त देखभाल करते हैं, तो एक नए जीसीसी का उपयोग करें, कम से कम एक जो आपके सीपीयू के बारे में जानता है, अधिमानतः वर्तमान स्थिर रिले।
tune=generic
एक ही माइक्रोआर्किटेक्चर परिवार के नए सदस्य के लिए किसी से बेहतर नहीं कर सकता है , विशेष रूप से केबी झील की तरह कुछ ऐसा है जो शाब्दिक रूप से स्काईलेक सूक्ष्मजीव के समान है। लेकिन मुझे लगता है कि यह अभी भी एक अलग परिवार है / इतना जीसीसी कदम है कि केवल स्काईलेक के बारे में पता था और पुराने इसे ट्यूनिंग के रूप में पहचानने में विफल हो सकते थे।