Tôi sẽ ném hai xu của mình vào câu hỏi này và đề nghị một phần mở rộng dài hơn một chút cho câu trả lời của elias. Kể từ gcc 4.6, việc chạy gcc -march=native -v -E - < /dev/null
phát ra lượng thư rác ngày càng tăng dưới dạng -mno-*
cờ thừa . Sau đây sẽ loại bỏ những điều này:
gcc -march=native -v -E - < /dev/null 2>&1 | grep cc1 | perl -pe 's/ -mno-\S+//g; s/^.* - //g;'
Tuy nhiên, tôi chỉ xác minh tính chính xác của điều này trên hai CPU khác nhau (Intel Core2 và AMD Phenom), vì vậy tôi cũng khuyên bạn nên chạy đoạn script sau để chắc chắn rằng tất cả các -mno-*
cờ này có thể được gỡ bỏ an toàn.
#!/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}.$$
Tôi không tìm thấy sự khác biệt giữa gcc -march=native -v -E - < /dev/null
và gcc -march=native -### -E - < /dev/null
ngoài một số tham số được trích dẫn - và các tham số không chứa ký tự đặc biệt, vì vậy tôi không chắc trong trường hợp nào điều này tạo ra sự khác biệt thực sự.
Cuối cùng, lưu ý rằng --march=native
đã được giới thiệu trong gcc 4.2, trước đó nó chỉ là một đối số không được công nhận.
--param l1-cache-size=64 --param l1-cache-line-size=64 --param l2-cache-size=512