3
我知道一般建議使用-march = native(如果您正在爲您所在的機器編譯),以便gcc確定您的arch和cputype並生成最特定於機器的代碼,但它如何去做?gcc如何在x86上確定-march = native?手臂上?
它使用cpuid(無論是手臂還是x86)?在沒有cpuid-like指令的平臺上使用什麼技術?
我知道一般建議使用-march = native(如果您正在爲您所在的機器編譯),以便gcc確定您的arch和cputype並生成最特定於機器的代碼,但它如何去做?gcc如何在x86上確定-march = native?手臂上?
它使用cpuid(無論是手臂還是x86)?在沒有cpuid-like指令的平臺上使用什麼技術?
好問題。
我的直覺是,它會去檢查/proc/cpuinfo
。實際上它取決於它已編譯運行的體系結構。好像host_detect_local_cpu
是對此負責的功能。它的任務是替換-march=native
無論是好-march=<...>
或一組儘可能與儘可能當前CPU是標誌(-mmmx
,-mno-avx
等)。 i386
和arm
的示例。 i386
直接使用cpuid
來檢查每個可能的功能。 arm
檢查在/proc/cpuinfo
爲CPU part
線中並且具有由一CPU部件值映射到生成的架構和直接在-march=<...>
使用此表。
只是爲了好玩,我檢查了其他架構(我不熟悉它們)。
sparc
:使用kstat
接口sparc
:使用/proc/cpuinfo
alpha
:使用implver
指令rs6000
:使用hw.cpusubtype
系統調用rs6000
:使用硬編碼powerpc
rs6000
:在/proc/self/auxv
檢查上rs6000
在自己的進程_system_configuration
(顯然是一個全球性的結構)