2011-03-29 9 views
126

मैं जीसीसी 4.3 का उपयोग कर अपने सी ++ ऐप को संकलित कर रहा हूं। ऑप्टिमाइज़ेशन झंडे मैन्युअल रूप से चुनने के बजाय मैं -march=native का उपयोग कर रहा हूं, जो सिद्धांत में हार्डवेयर पर लागू सभी ऑप्टिमाइज़ेशन झंडे को जोड़ना चाहिए जो मैं संकलित कर रहा हूं। लेकिन मैं कैसे जांच सकता हूं कि वास्तव में इसका उपयोग किस झंडे का उपयोग कर रहा है?कैसे देखें flags -march = मूल सक्रिय होगा?

उत्तर

119

आप -Q --help=target विकल्पों का उपयोग कर सकते हैं:

gcc -march=native -Q --help=target ... 

-v विकल्प भी उपयोग की जा सकती है।

आप --help विकल्प here पर दस्तावेज़ देख सकते हैं।

+8

मैं सुझाव देना चाहता हूं कि यह उप-शीर्ष है। --help = target का आउटपुट CPU कैश जानकारी प्रदर्शित नहीं करता है, जिसमें से नीचे दिए गए एलियास और 42n4 दोनों विधियां सूचीबद्ध हैं। विशेष रूप से, एक फेनोम पर जीसीसी 4.9.2 पर, आउटपुट में इन्हें शामिल किया गया है: '--param l1-cache-size = 64 --param l1-cache-line-size = 64 --param l2-cache-size = 512 ' –

+0

@DanielSantos: मेरे सिस्टम पर यह 'cc1' कमांड लाइन के हिस्से के बावजूद' -v' विकल्प के साथ उन पैरामीटर को प्रदर्शित करता है ... – thkala

+0

सही नहीं है। जीसीसी संस्करण 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) पर यह बदले में त्रुटि का कारण बन जाएगा: असेंबलर संदेश: त्रुटि: अज्ञात आर्किटेक्चर मूल त्रुटि: अपरिचित विकल्प -मार्क = मूल। तो, '-march = native' को हटाएं और यह हर जगह काम करेगा:' gcc -Q --help = target'। –

61

कमांड लाइन झंडे देखने के लिए, का उपयोग करें:

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1 

आप को देखने के लिए संकलक/precompiler कुछ मापदंडों द्वारा निर्धारित परिभाषित करता है, ऐसा करते हैं चाहते हैं:

echo | gcc -dM -E - -march=native 
+0

यह उत्तर स्वीकृत एक के रूप में स्वीकृत एक के रूप में कई अपवर्तकों के हकदार है, विशेष रूप से, 'मूल' वास्तव में क्या समझाता है। –

+0

इसलिए यदि मैं क्रॉस-नेटिव-संकलन करना चाहता हूं, तो मुझे दोनों कंपाइलर को परिभाषित और तर्क दोनों को खिलाया जाना चाहिए? या तर्क पर्याप्त है? – hanshenrik

14

यह होना चाहिए (-###-v के समान है):

echo | gcc -### -E - -march=native 

"री एल "जीसीसी के लिए देशी झंडे।

आप उन्हें एक आदेश के साथ और अधिक "स्पष्ट रूप से" प्रदर्शित कर सकते हैं:

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* -)//g' 

और आप के साथ -mno- साथ झंडे से छुटकारा पा सकते *:

gcc -### -E - -march=native 2>&1 | sed -r '/cc1/!d;s/(")|(^.* -)|(-mno-[^\ ]+)//g' 
8

आप जानना चाहते हैं तो बाहर सेट अप करने के लिए कैसे एक गैर मूल पार संकलन, मैं इस उपयोगी पाया:

लक्ष्य मशीन पर,

% gcc -march=native -Q --help=target | grep march 
-march=        core-avx-i 

फिर निर्माण मशीन पर इस का उपयोग करें:

% gcc -march=core-avx-i ... 
+0

दुर्भाग्य से सभी झंडे शामिल नहीं होंगे। –

+0

@BaptisteWicht वहाँ झंडे हैं कि-मार्च = मूल में शामिल होगा- मार्च = कोर-एवीएक्स- मैं, इस मामले में, या कौन सा झंडे नहीं? धन्यवाद! – rogerdpack

+2

@rogerdpack इस कंप्यूटर (रेतीलेब्रिज) पर, मार्च = sandybridge AVX को सक्षम नहीं करता है (क्यों नहीं पता) मार्च = मूल करता है। एक और महत्वपूर्ण अंतर यह है कि कैश आकार केवल मार्च = मूल –

7

मैं एलियास के जवाब के लिए थोड़ी ज्यादा वर्बोज़ विस्तार का सुझाव इस सवाल में मेरी दो सेंट फेंक करने जा रहा हूँ और। जीसीसी 4.6 के अनुसार, gcc -march=native -v -E - < /dev/null चलने से अनावश्यक -mno-* झंडे के रूप में स्पैम की बढ़ती मात्रा निकलती है। निम्नलिखित इन हटेगा:

gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;' 

हालांकि, मैं केवल दो अलग अलग सीपीयू (एक Core2 इंटेल और AMD Phenom) पर इस की सत्यता की पुष्टि कर ली है, तो मैं भी निम्न स्क्रिप्ट चलाने की सलाह देते सुनिश्चित करने के लिए सभी को है कि इन -mno-* झंडे सुरक्षित रूप से छीन लिया जा सकता है।

#!/bin/bash 

gcc_cmd="gcc" 

# Optionally supply path to gcc as first argument 
if (($#)); then 
    gcc_cmd="$1" 
fi 

with_mno=$(
    "${gcc_cmd}" -march=native -mtune=native -v -E - < /dev/null 2>&1 | 
    grep cc1 | 
    perl -pe 's/^.* - //g;' 
) 
without_mno=$(echo "${with_mno}" | perl -pe 's/ -mno-\S+//g;') 

"${gcc_cmd}" ${with_mno} -dM -E - </dev/null> /tmp/gcctest.a.$$ 
"${gcc_cmd}" ${without_mno} -dM -E - </dev/null> /tmp/gcctest.b.$$ 

if diff -u /tmp/gcctest.{a,b}.$$; then 
    echo "Safe to strip -mno-* options." 
else 
    echo 
    echo "WARNING! Some -mno-* options are needed!" 
    exit 1 
fi 

rm /tmp/gcctest.{a,b}.$$ 

मैं gcc -march=native -v -E - < /dev/null और gcc -march=native -### -E - < /dev/null कुछ मानकों उद्धृत किया जा रहा के अलावा अन्य के बीच एक अंतर नहीं मिला है - और पैरामीटर है कि कोई विशेष वर्ण, तो मैं किन परिस्थितियों इस किसी भी असली फर्क नहीं पड़ता तहत यकीन नहीं है।

अंत में, ध्यान दें कि --march=native जीसीसी 4.2 में पेश किया गया था, इससे पहले कि यह केवल एक अपरिचित तर्क है।

+0

अच्छा, इस gleans कैश के रूप में अच्छी तरह से आकार – rogerdpack

+0

जीसीसी संस्करण 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-गंदा) रिटर्न है? यह हो सकता है कि "मूल" केवल कुछ आर्किटेक्चर पर समर्थित है। –

+0

ओलेग: क्या मेहराब आप उपयोग कर रहे –

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