Как посмотреть, какие флаги -march = native активируют? - PullRequest
147 голосов
/ 29 марта 2011

Я компилирую свое приложение на C ++, используя GCC 4.3.Вместо того, чтобы вручную выбирать флаги оптимизации, я использую -march=native, что теоретически должно добавить все флаги оптимизации, применимые к оборудованию, на котором я собираюсь.Но как я могу проверить, какие флаги он использует на самом деле?

Ответы [ 6 ]

134 голосов
/ 29 марта 2011

Вы можете использовать опции -Q --help=target:

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

Также может быть полезна опция -v.

Документацию по опции --help можно посмотреть здесь .

88 голосов
/ 20 февраля 2012

Чтобы увидеть флаги командной строки, используйте:

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

Если вы хотите увидеть, как компилятор / прекомпилятор определяет набор определенных параметров, сделайте следующее:

echo | gcc -dM -E - -march=native
18 голосов
/ 23 сентября 2013

Должно быть (-### похоже на -v):

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

Чтобы отобразить "настоящие" собственные флаги для gcc.

Вы можете сделать их больше«ясно» с помощью команды:

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 голосов
/ 14 июня 2014

Если вы хотите узнать, как настроить не родную кросс-компиляцию, я нашел это полезным:

На целевой машине

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

Затем используйте это на сборочной машине:

% gcc -march=core-avx-i ...
7 голосов
/ 29 января 2015

Я собираюсь бросить свои два цента в этот вопрос и предложить немного более подробное продолжение ответа Элиаса.Начиная с gcc 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;'

Однако, я проверил правильность этого только на двух разных процессорах (Intel 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 был введен в gcc 4.2, до чего это просто нераспознанный аргумент.

0 голосов
/ 19 июня 2019

Я написал скрипт, который будет выдавать список флагов, готовый для отправки обратно в gcc из вывода gcc -march=native -mtune=native -Q --help=target.Это немного грубо, неэффективно, но, похоже, это помогает.

Есть одно предупреждение, о котором я знаю: опции со знаком равенства (=) и никакие значения не удаляются намеренно.

gcc -march=native -mtune=native -Q --help=target -v 2>&1 \
| grep -h "The following options" -A200 -B0 \
| tail -n +2 \
| grep -h "Known assembler" -A0 -B999 \
| head -n -2 \
| grep -v "disabled" \
| sed -r 's/\[(enabled|default)\]//g'\
| sed -r 's/\s*//g' \
| sed -r 's/\=$//g' \
| sed -r 's/<.*>//g' \
| xargs

Вы можете удалить xargs в конце, чтобы увидеть флаги построчно.

Редактировать: Включая пример выходных данных.На моей машине (Intel® Core® TM i5-4300U CPU @ 1,90 ГГц) это дает мне:

-m128bit-long-double -m64 -m80387 -mabi=sysv -mabm -maddress-mode=long -maes -malign-data=compat -malign-functions=0 -malign-jumps=0 -malign-loops=0 -malign-stringops -march=haswell -masm=att -mavx -mavx2 -mbmi -mbmi2 -mbranch-cost=3 -mcmodel -mcpu -mcx16 -mf16c -mfancy-math-387 -mfma -mfp-ret-in-387 -mfpmath=sse -mfsgsbase -mfunction-return=keep -mfused-madd -mfxsr -mglibc -mhard-float -mhle -mieee-fp
-mincoming-stack-boundary=0 -mindirect-branch=keep -mintel-syntax -mlarge-data-threshold=65536 -mlong-double-80 -mlzcnt -mmemcpy-strategy -mmemset-strategy -mmmx -mmovbe -mpclmul -mpopcnt -mprefer-avx128 -mprefer-vector-width=none -mpreferred-stack-boundary=0 -mpush-args -mrdrnd -mrecip -mred-zone -mregparm=6 -msahf -msse -msse2 -msse3 -msse4 -msse4.1 -msse4.2 -msse5 -mssse3 -mstack-protector-guard-offset -mstack-protector-guard-reg -mstack-protector-guard-symbol -mstack-protector-guard=tls -mstringop-strategy -mstv
-mtls-dialect=gnu -mtls-direct-seg-refs -mtune-ctrl -mtune=haswell -mveclibabi -mvzeroupper -mxsave -mxsaveopt
...