ฉันจะโยนสองเซ็นต์ของฉันเป็นคำถามนี้และแนะนำการขยายคำตอบของ elias ที่ละเอียดขึ้นเล็กน้อย ตั้งแต่ 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