जीसीसी: मार्च मार्च से कैसे अलग है?


88

मैंने इसके लिए जीसीसी मैन पेज को खंगालने की कोशिश की, लेकिन अभी भी यह वास्तव में नहीं मिलता है।

बीच क्या अंतर है -marchऔर -mtune?

एक का उपयोग कब होता है -march, दोनों बनाम? क्या यह सिर्फ कभी संभव है -mtune?

जवाबों:


97

यदि आप उपयोग करते हैं -marchतो जीसीसी उन निर्देशों को उत्पन्न करने के लिए स्वतंत्र होगा जो निर्दिष्ट सीपीयू पर काम करते हैं, लेकिन (आमतौर पर) वास्तुकला परिवार में पहले के सीपीयू पर नहीं।

यदि आप अभी उपयोग करते हैं -mtune, तो संकलक कोड उत्पन्न करेगा जो उनमें से किसी पर भी काम करता है, लेकिन आपके द्वारा बताए गए विशिष्ट सीपीयू पर सबसे तेजी से चलने वाले निर्देश अनुक्रम का पक्ष लेंगे। उदाहरण के लिए, लूप-अनियंत्रित उत्तराधिकार को उस सीपीयू के लिए उचित रूप से सेट करना।


-march=fooतात्पर्य -mtune=fooजब तक आप एक अलग निर्दिष्ट नहीं करते -mtune। यह एक कारण है कि ट्यूनिंग के बारे में कुछ भी किए बिना -marchविकल्पों को सक्षम करने से बेहतर है -mavx

कैविएट: -march=nativeएक सीपीयू पर जो जीसीसी विशेष रूप से पहचान नहीं करता है, फिर भी नए निर्देश सेट को सक्षम करेगा जो जीसीसी का पता लगा सकता है, लेकिन छोड़ देगा -mtune=generic। एक नए पर्याप्त जीसीसी का उपयोग करें जो आपके सीपीयू के बारे में जानता है यदि आप चाहते हैं कि यह अच्छा कोड बनाये।


10
जवाब नहीं देता है कि क्या यह दोनों का उपयोग करने के लिए समझ में आता है या क्या mtune बेमानी है जब एक ही मूल्य पर सेट किया जाता है।
पावेल Paमरदा

12
@ Pavel answerimerda सहज रूप से उत्तर 2 सुविधाओं की परिभाषा में निहित है। इसके अलावा, प्रलेखन स्पष्ट रूप से बताता है कि marchइसका मतलब है mtune। तो, आपकी आपत्तियों के जवाब क्रमशः नहीं और हां हैं।
अंडरस्कोर_ड

इतनी शिद्दत से समझाने के लिए शुक्रिया! आप इसे समझना आसान बनाते हैं।
रहीम खोजा

5
लोगों को एक tl; dr की जरूरत है: -march का उपयोग करें यदि आप इसे केवल अपने प्रोसेसर पर चलाते हैं, तो -mtune का उपयोग करें यदि आप इसे अन्य प्रोसेसर के लिए सुरक्षित चाहते हैं।
j riv

3
उपयोगकर्ताओं को यह भी समझना चाहिए कि पुराने संकलक (कुछ सीपीयू मौजूद नहीं होने से पहले जारी किए गए) के परिणामस्वरूप भिन्न इष्टतम mtuneऔर marchसंयोजन हो सकते हैं। यह ब्लॉग पोस्ट उस बिंदु को दूसरों के साथ प्रकाशित करता है: lemire.me/blog/2018/07/25/…
qneill

53

यह वही है जो मैंने गुगली किया है:

-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=genericgenericवर्तमान सीपीयू ( 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, अगर आप कभी भी उसी मशीन पर चलने जा रहे हैं जिस पर आप निर्माण करते हैं।


4
लेकिन अगर आप उपयोग करते हैं -march=native, तो आप निर्दिष्ट करना चाह सकते हैं -mtune=X, क्योंकि डिफ़ॉल्ट अभी भी है -mtune=generic, जैसा कि यहां चर्चा की गई है: lemire.me/blog/2018/07/25/…
रोलाण्ड वेबर

@ रोलैंड वेबर: यह केवल तब होता है जब आप अपने सीपीयू के बारे में जानने के लिए जीसीसी का उपयोग करते हैं। -march=nativeतात्पर्य tune=nativeयदि आप एक जीसीसी कि अपने CPU के बारे में जानता का उपयोग ठीक। वह लेख केवल बुरे मामले को प्रस्तुत करता है। नए जीसीसी संस्करण सामान्य रूप से बेहतर कोड बनाते हैं, खासकर एवीएक्स 2 और एवीएक्स -51 जैसे नए निर्देशों का उपयोग करते समय। और आपके सीपीयू के लिए डिज़ाइन की गई ट्यूनिंग सेटिंग्स (जैसे लूप अनरोलर ह्यूरिस्टिक्स) एक निश्चित प्लस है। इसलिए यदि आप इन विकल्पों का उपयोग करने के लिए प्रदर्शन के बारे में पर्याप्त देखभाल करते हैं, तो एक नए जीसीसी का उपयोग करें, कम से कम एक जो आपके सीपीयू के बारे में जानता है, अधिमानतः वर्तमान स्थिर रिले।
पीटर कॉर्डेस

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