Я збираюся кинути свої два центи на це питання і запропонувати трохи більш багатослівне розширення відповіді Іллі. Станом на 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, перед яким це лише нерозпізнаний аргумент.
--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512