कैसे देखें कि कौन से झंडे -मार = देशी सक्रिय होंगे?


165

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

जवाबों:


150

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

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

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

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


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

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

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

@Oleg - जीसीसी 5. अंक में एक बग की तरह है कि लगता है जीसीसी 7. में मौजूद नहीं है
jww

111

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

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

यदि आप कुछ मापदंडों द्वारा निर्धारित कंपाइलर / प्री-कंपाइलर को देखना चाहते हैं, तो यह करें:

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

1
यह उत्तर उतने ही उत्थान के योग्य है, जितना कि विशेष रूप से सूचीबद्ध करने के लिए, जो nativeवास्तव में समान है।
इविलनोटिक्सिस्ट इडोनोटेक्सिस्ट

4
इसलिए अगर मैं क्रॉस-देशी-संकलन करना चाहूंगा, तो मुझे कंपाइलर को परिभाषित और तर्क दोनों को खिलाना चाहिए? या तर्क पर्याप्त हैं?
बजे २:१

25

यह होना चाहिए ( -###के समान है -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'

10

यदि आप यह जानना चाहते हैं कि गैर-देशी क्रॉस संकलन कैसे सेट किया जाए, तो मुझे यह उपयोगी लगा:

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

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

फिर इसे बिल्ड मशीन पर उपयोग करें:

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

इसमें दुर्भाग्य से सभी झंडे शामिल नहीं होंगे।
बैप्टिस्ट विच

@ बपतिस्मा देनेवालों में ऐसे झंडे होते हैं जो -march = देशी में वह -march = core-avx-i शामिल होगा, इस मामले में, या कौन से झंडे नहीं होंगे? धन्यवाद!
रॉगरडैक

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

1
@ BaptisteWicht यहाँ अजीब है (मुझे लगता है) काम करने के लिए लगता है: echo | gcc-6 -dM -E - -march=sandybridge | grep AVX #define __AVX__ 1लेकिन कैश आकार अनुपस्थित लगता है।
रोज़गारपैक

7

मैं इस सवाल में अपने दो सेंट फेंकने जा रहा हूं और एलियास के उत्तर के बारे में थोड़ा और विस्तार करने का सुझाव दूंगा। 4.6 gcc के रूप में, दौड़ने 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;'

हालांकि, मैंने केवल दो अलग-अलग सीपीयू (एक इंटेल कोर 2 और एएमडी फेनोम) पर इस की शुद्धता को सत्यापित किया है, इसलिए मेरा सुझाव है कि निम्नलिखित स्क्रिप्ट को चलाने के लिए सुनिश्चित करें कि इन सभी -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=nativegcc 4.2 में पेश किया गया था, जिसके पहले यह सिर्फ एक गैर-मान्यता प्राप्त तर्क है।


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

gcc संस्करण 5.4.0 (Buildroot 2017.05-rc2-00016-gc7eaf50-dirty) रिटर्न: त्रुटि: अज्ञात वास्तुकला `मूल '
ओलेग कोकोरिन

ओलेग: आप किस आर्क का उपयोग कर रहे हैं? यह हो सकता है कि "मूल" केवल कुछ आर्किटेक्चर पर समर्थित हो।
डैनियल सैंटोस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.